SLen:string;
SData:array of byte;我是通过idTCPClient传送消息的,规定消息范围为0到65000,是以字节的形式来传送的,在发送前要在消息包前加载4个字节的长度值再与消息一起发关,长度值用16进制字符(0-F)表示的4位整数来表示。
str='hello'
SLen:=inttohex(sizeof(Str),4);
Str:=SLen+Str;
for i:=0 to Length(Str) do
  SData[i] := DWORD(str[i]);
AThread.Connection.WriteBuffer(SData,sizeof(SData),False)
我这样写对吗?

解决方案 »

  1.   

    为什么要把长度转为字符串?
    AThread.Connection.WriteInteger(Length(Str));
    AThread.Connection.WriteBuffer(PChar(Str)^, Length(Str), True);
    如果你非要按照你的想法来发送
    str='hello'
    SLen:=inttohex(Length(Str),4);
    SetLength(SData, Length(Str) + 4);
    Str:=SLen+Str;
    for i:=1 to Length(Str) do
      SData[i - 1] := ord(str[i]);
    AThread.Connection.WriteBuffer(SData,Length(Str) + 4,False)
      

  2.   

    SLen:=inttohex(Length(Str),4);
    SetLength(SData, Length(Str) + 4);
    Str:=SLen+Str;
    for i:=1 to Length(Str) do
      SData[i - 1] := ord(str[i]);
    AThread.Connection.WriteBuffer(SData,Length(Str) + 4,False)
    ----------------------------------
    动态数组发送的话恐怕会有问题,发送出去的是4字节的指针和一部分无效数据
    如果要动态传值的话应该这样处理
    1、首先定义一个足长的buff:array[0..65000] of Char;
    2、
    str='hello'
    SLen:=inttohex(sizeof(Str),4);
    Str:=SLen+Str;
    for i:=0 to Length(Str) do
      buff[i]:=str[i];
    AThread.Connection.WriteBuffer(buff,length(str),False);
    -------------------------------------
    关键就是不要把动态数组当成abuffer发送出去...
    详细原因请看:http://community.csdn.net/Expert/topic/3836/3836430.xml?temp=.5346643