我的程序需要通过流的形式传递一些数据给其他接收程序,接收放可能是C写的。现对于字符的使用上面有一些疑问请教大家。
比如我要传递的数据第一、二个字节传的都一个32位无符号整数,第三个到第十二个字节传递的是一个十字节长度的字符串。无符号整数我使用的Cardinal类型,字符串我定义成了String[9](因为DELPHI里面String[9]需要占用10个字节的长度,头一个字节存储的是标识这个字符串真正长度的一个整数),则表现成二进制流就是这样(这里面存储了值为16和17的两个整数和字符串"HHHHHH"):
10 00 00 00 11 00 00 00 06 48 48 48 48 48 48 00 00 00
这样的话我有两个疑问了:
1。那么String[9]只能传递9个字节的字符串,如果我确实需要10个字节长度而定义成String[10]的话,那岂不是占用了11个字节长?而如果后面还用别的数据,这样对于别的语言来解析这个流的时候应该会出现错乱吧?
2。是否所有语言在将字符串写到流里面的时候都会将第一位用来标识实际的长度?
3。如果不是则我改用什么类型的字符串?PCHAR吗?我发现PCHAR总是占用4个字节的长度,而我的要求是不管实际字符串有多长都要占用10个字节,长度不够的就用结束符补全。

解决方案 »

  1.   

    你最好用PCHAR,接收方如果是C的话。补全也不是很麻烦啊,
    反正你要赋初值。记得用StrCopy赋值就OK。
      

  2.   

    用Array [0..9] Of Char
      

  3.   

    我也曾被你这样的问题困扰过. 问题在于pchar是以null(0)结尾的字符串,如果string中包含#0,把它转换为pchar时,#0后的内容就会丢失.
      解决方案:Base64编码是一个很方便的解决方案,它能把各种数据类型(Stream,Blob),变成可见的字符串。Delphi中有一个单元encdDecd.pas,其中有DecodeStream,EncodeStream,DecodeString,EncodeString等几个函数,能方便进行这种转换。