我用delphi的TServerSocket的sendbuf向手持机发送数据,要求以以下格式组织:
A5C3          LEN           SEQ              RAW   DATA      A599
Flag(2byte) Length(3 byte)  Sequence(12byte)       Data      Flag(2byte)
举例:
给模块输入:A5 C3 00 00 00 00 41 42 43 44 A5 99
则接受端收到:ABCD
注释:0123456789ABCDEF对应的16进制30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46假如我发送ABCD到手持机,则需要将A5 C3 00 00 00 00 41 42 43 44 A5 99组织成一个数组,
我想可以是byte类型或char(也可能是其他)。但我不知道怎么进行组织,帮帮我吧,急啊!

解决方案 »

  1.   

    c中可以这样组织,unsigned char strbuf[120] = {0xA5,0xC3,0x00,0x00,0x00,0x00};那delphi呢???
      

  2.   

    A5 C3 00 00 00 00 41 42 43 44 A5 99var
      sendbuf:array of byte;
    setlength(sendbuf,12);
    sendbuf[0]:=$a5;
    sendbuf[1]:=$c3;
    sendbuf[2]:=$0;
    sendbuf[3]:=$0;
    sendbuf[4]:=$0;
    sendbuf[5]:=$0;
    sendbuf[6]:=$41;
    sendbuf[7]:=$42;
    sendbuf[8]:=$43;
    sendbuf[9]:=$44;
    sendbuf[10]:=$a5;
    sendbuf[11]:=$99;
    这是最笨的办法了。你所讲的数据组织的特点并不明显。如果有明显的规律,可以自己做个函数或是方法什么的就行了。A5C3          LEN           SEQ              RAW   DATA      A599
    Flag(2byte) Length(3 byte)  Sequence(12byte)       Data      Flag(2byte)
    这是你的指令协议吧。
    你可以做一个指令生成的方法啊。
    比如,做一个全局的发送缓存区;
    var
      sendbuffer:array of char;procedure GetSendCmd(const Senddata:string);//---将数据按字符串格式传入
    var
      cmdlen,index:integer;
      tempstr:string;
    begin
     cmdlen:=length(Senddata)+17;
     setlength(sendbuffer,cmdlen);
     zeromemory(sendbuffer,cmdlen);
     //---指令头与控制字
     sendbuffer[0]:=char($a5);
     sendbuffer[1]:=char($c3);
     tempstr:=inttohex(cmdlen,3);//--不明白你的指令怎么只有三个字节呢?一般地应为双字节数啊。
    //--写Sequence的东西,自己写,我也不明白你要写什么东西。:)
     //--写数据内容:
     for index:=17 to cmdlen-3 do
       sendbufer[index]:=senddata[18-index]; //--指令尾写入
     sendbuffer[cmdlen-2]:=char($a5);
     sendbuffer[cmdlen-1]:=char($99);end;
      

  3.   

    var
      sendbuffer:array of char;procedure GetSendCmd(const Senddata:string);//---将数据按字符串格式传入
    var
      cmdlen,index:integer;
      tempstr:string;
    begin
     cmdlen:=length(Senddata)+17;
     setlength(sendbuffer,cmdlen);
     zeromemory(sendbuffer,cmdlen);
     //---指令头与控制字
     sendbuffer[0]:=char($a5);
     sendbuffer[1]:=char($c3);
     tempstr:=format('%.3d',[cmdlen]);//--不明白你的指令怎么只有三个字节呢?一般地应为双字节数啊。
    //--写入指令长度的数据,你自己根据上面的内容来写吧。
    //--写Sequence的东西,自己写,我也不明白你要写什么东西。:)
     //--写数据内容:
     for index:=1 to cmdlen do
       sendbufer[16+index]:=senddata[index];//---呵~~,这是个BUG。自己更正下。:) //--指令尾写入
     sendbuffer[cmdlen-2]:=char($a5);
     sendbuffer[cmdlen-1]:=char($99);end;
      

  4.   

    正如你所说:我的本意是一个编辑框输入内容,可以有汉字,我想实现转化procedure TForm_Server_Main.BitBtn1Click(Sender: TObject);
    var
      data: array of byte;
       str: string;
        i: integer;
      begin
        SetLength(data, length(Edit1.Text));
        str := Edit1.Text;
        for i := 1 to Length(str) do
        begin
          data[i-1] :=StrToInt(IntToHex(ord(str[i]),2));//这里不支持汉字,能找到更好的转换函数就好了
        end;
      

  5.   

    呵~~,一样的支持汉字啊。你这样取出来的码值就是汉字的GB码啊。一个汉字占用两个字节是对的啊。这并不错啊。呵~~。我不明白:取汉字就不行?
    比如:“中”字,它的GB码就是:0xD6D0
    用上面的方法取就是正确的。
      

  6.   

    找到正确答案了:data[i-1] :=StrToInt('$'+IntToHex(ord(str[i]),2));
      

  7.   

    D6转化成int会溢出的,所以得加$