我在研究一个第三方软件的封包协议,现在碰到个问题0000   00 00 00 11 00 00 00 a0 00 00 00 a0 00 00 00 00  ................
0010   00 00 00 00 15 00 00 00 01 00 00 00 94 00 00 00  ................
0020   08 31 32 33 34 35 36 37 38 00 00 00 00 7f 36 38  .12345678.....68问题就是字符串 12345678 这里,这里的长度不是固定的,那么在我的自定义结构里没法写入tabc = packed record
  ……
  ……
  ss: array[0..254] of char;    // 长度固定了,不行
end;怎么解决呢?

解决方案 »

  1.   

    前面的08应该指的就是长度bLen : Byte;
    ss:array[0..0] of Char;使用字串的时候,要用@ss去访问然后根据字串结尾是否已经加0截断
    截断了直接StrPas或不指定就可以访问没截断就建议用StrLCopy之类的复制出来用。
      

  2.   

    tabc = packed record
      ……
      ssLen:Integer; //这里设置字符串的长度
      ss: array of char; // 长度固定了,不行
    end;
      

  3.   

    你可能没理解我的意思,那个包(自定义结构)是我要send到服务器的
    字符串 12345678 是由用户来输入的,长度不确定我用的一个自定义结构,但是在char声明时又必须指定长度
      

  4.   

    试了一下,有2个问题Tabc = packed record
        len: integer;
        str: array of char;
      end;
    var
      aa: tabc;
    begin
      s := 'abcdef';
      len := Length(s);
      aa.len := len;
      StrPCopy(@aa.str, s);
      …………//
    end;抓包里看到的
    1.char的实际数据总是4字节,就是字符为abcdef的话只显示abcd
    2.长度在包里的高低位是反的,与那个第三方程序不同
    正常的 00 00 00 08
    我这的 08 00 00 00
      

  5.   

    array of char是指针,如果要直接套在数据上,就定义一个足够长的字符数组吧
    PACKED RECORD是紧凑记录,RECORD是数据对齐的。
    Tabc = packed record
        len: integer;
        str: array[0..1023] of char;
        end;