【问题标题】:Embarcadero Cannot cast from 'UnicodeString' to 'unsigned char *'Embarcadero 无法从 'UnicodeString' 转换为 'unsigned char *'
【发布时间】:2013-04-26 12:39:32
【问题描述】:

我正在使用 Embarcadero 的 C++ builder XE

String command1 = "FREQ ";
String command2 = " Mhz\n";
int index = Form1->ListBox1->ItemIndex;

String full = command1.operator +=(IntToStr((index+2)*10)).operator +=(command2);
TcpClient1->SendBuf((BYTE*)full,13,0);Sleep(30);

在最后一行我得到 E2031 无法从 'UnicodeString' 转换为 'unsigned char*'

我发送的是我的设备(接收器)的命令,其格式为(命令,lenght_of_command)。当我以计划文本发送它时,例如

TcpClient1->SendBuf((BYTE*)"FREQ 330.5 MHz\n",15,0);Sleep(30);

一切正常。非常感谢您的帮助。

【问题讨论】:

    标签: c++ string casting c++builder unicode-string


    【解决方案1】:

    String 映射到 XE 中的 UnicodeString。修复代码的最简单方法是改用AnsiString(并停止使用+= 运算符,因为您没有正确使用它):

    AnsiString command1 = "FREQ ";
    AnsiString command2 = " Mhz\n";
    int index = Form1->ListBox1->ItemIndex;
    
    AnsiString full = command1 + IntToStr((index+2)*10) + command2;
    TcpClient1->SendBuf((BYTE*)full.c_str(),full.Length(),0);
    Sleep(30);
    

    或者:

    int index = Form1->ListBox1->ItemIndex;
    AnsiString full;
    full.sprintf("FREQ %d Mhz\n", (index+2)*10);
    TcpClient1->SendBuf((BYTE*)full.c_str(),full.Length(),0);
    Sleep(30);
    

    【讨论】:

      【解决方案2】:

      我只会使用 sprintf

      char command[999];
      sprintf(command, "FREQ %d MHz\n", (index+2)*10);
      TcpClient1->SendBuf((BYTE*)command,strlen(command),0);
      Sleep(30);
      

      【讨论】:

      • 您浪费了 900 多个永远不会使用的字节。要么将数组的大小减小到实际需要的最小长度(最大 21),要么切换到 AnsiString 并使用其 sprint() 方法。
      猜你喜欢
      • 2012-09-03
      • 1970-01-01
      • 2012-04-28
      • 2014-12-27
      • 2013-02-09
      • 1970-01-01
      • 2011-10-19
      • 2013-09-23
      • 2011-07-23
      相关资源
      最近更新 更多