求助:delphi7下 按UTF-8编码将字符串转换成byte数组

时间:2022-07-20 22:26:16
在发送消息时需将字符串指令按UTF-8编码将字符串转换成byte数组,在该byte数组前附加两个字节(big endian)描述后续字节数。


我和别的公司做TCP对接    我这边是客户端    
他文档中有上面一句话  

我的理解是  先将 string 转换成 UTF8String 在将 UTF8String 赋值给 byte数组  

但是信息是错误的   是不是我理解错误了  

我的代码如下 

var LoginInfo: string;
  temp1: UTF8String;
  retuInfo, count: Integer;
  pass: MD5Digest;
  info: array of Byte;
  readarr: array[0..254] of Byte;
begin
//DlSocketProxy.connectServer;

  try

    pass := MD5String(serverPWD);
    temp1 := MD5Print(pass);
    //要发送的字符串   
    LoginInfo := '1,' + serverID + ',' + FormatDateTime('yyyymmddhhmmss', Now) + ',' + temp1;
    count := Length(LoginInfo);
    //转化成 UTF8String
    temp1 := UTF8Encode(LoginInfo);


    SetLength(info, count + 2);
    //转化成byte数组
    Move(temp1[1], info[2], count);
    retuInfo := Length(info);
    //添加描述字符    第一个字节为0   第二个字节为 数据原始长度
    info[0] := 0;
    info[1] := retuInfo - 2;
   except

  end;

end;

8 个解决方案

#1


理解应该没问题
服务端单位有没有提供DEMO或技术支持,这个最好问一下
附加的两个字节描述符有没有问题?

#2


问下服务器开发公司不就知道了,省得自己瞎猜,费时又费力!若真不是这样,那岂不是浪费时间?

#3


引用 1 楼 tjianliang 的回复:
理解应该没问题
服务端单位有没有提供DEMO或技术支持,这个最好问一下
附加的两个字节描述符有没有问题?


我刚才也在考虑是否是后面的 描述字节的问题  我确认一下 

#4


按你的代码 info[1] 直接等于count不就行了?
而且这句好像不对吧
Move(temp1[1], info[2], count);
count是ansi字符串的长度而utf8英文数字1字节,其他特殊字符包括汉字等占2~4不等,那么你这种赋值方法肯定会有隐患
而且以前版本的delphi UTF8Encode函数有bug对于单字节中英文混排的转换会出现乱码

#5


更正是单字赋汉字和中英文混排

#6


引用 5 楼 funxu 的回复:
更正是单字赋汉字和中英文混排

没有中文  

#7


叫服务端提供DEMO不就好了,提供这种服务连接的都会有DEMO

#8


引用 7 楼 kaikai_kk 的回复:
叫服务端提供DEMO不就好了,提供这种服务连接的都会有DEMO

服务商现在很牛  没有任何demo  

#1


理解应该没问题
服务端单位有没有提供DEMO或技术支持,这个最好问一下
附加的两个字节描述符有没有问题?

#2


问下服务器开发公司不就知道了,省得自己瞎猜,费时又费力!若真不是这样,那岂不是浪费时间?

#3


引用 1 楼 tjianliang 的回复:
理解应该没问题
服务端单位有没有提供DEMO或技术支持,这个最好问一下
附加的两个字节描述符有没有问题?


我刚才也在考虑是否是后面的 描述字节的问题  我确认一下 

#4


按你的代码 info[1] 直接等于count不就行了?
而且这句好像不对吧
Move(temp1[1], info[2], count);
count是ansi字符串的长度而utf8英文数字1字节,其他特殊字符包括汉字等占2~4不等,那么你这种赋值方法肯定会有隐患
而且以前版本的delphi UTF8Encode函数有bug对于单字节中英文混排的转换会出现乱码

#5


更正是单字赋汉字和中英文混排

#6


引用 5 楼 funxu 的回复:
更正是单字赋汉字和中英文混排

没有中文  

#7


叫服务端提供DEMO不就好了,提供这种服务连接的都会有DEMO

#8


引用 7 楼 kaikai_kk 的回复:
叫服务端提供DEMO不就好了,提供这种服务连接的都会有DEMO

服务商现在很牛  没有任何demo