Fri*_*iso 0 delphi indy delphi-2007 delphi-xe7
我已经检查过,当我将整数转换为十六进制时,它们分别变为4C52和524C000000000000,因此看起来好像字节是反转的.
客户端运行在Delphi XE7 for android上,服务器运行在Delphi 2007上.
我怎样才能解决这个问题?
推送客户代码: Client.IOHandler.Write(19538);
拉服务器代码: AContext.Connection.IOHandler.ReadInt64; //receives 5930114809340100608
您没有考虑字节序或字节大小.
TIdIOHandler.Write()
接受主机字节顺序的数值的整数重载,根据平台可能是小端或大端,并且默认情况下将它们转换为网络字节顺序,这是大端.整数TIdIOHandler.Read...()
方法默认情况下期望数值以网络字节顺序到达,并且默认情况下将按顺序将它们转换为主机.因此,如果您在双方都使用Indy,那么您不必担心这个细节,因为无论两端的哪个平台,读/写的结尾都是一致的.
该TIdIOHandler.Write()
数字过载,和TIdIOHandler.Read...()
数值方法,都有一个可选的Convert
参数默认为真.如果将此值设置为False,则将以主机字节顺序而不是网络字节顺序发送/读取值.
更重要的是你正在阅读Int64
,但你没有发送Int64
.TIdIOHandler.Write()
对于各种整数类型,存在多个重载,并且无类型19538
常量永远不会解决Int64
具有此类重载的情况.所以你需要使用类型转换来告诉编译器使用Int64
重载:
Client.IOHandler.Write(Int64(19538));
Run Code Online (Sandbox Code Playgroud)
或者使用变量:
var
Value: Int64;
Value := 19538;
Client.IOHandler.Write(Value);
Run Code Online (Sandbox Code Playgroud)
拉取服务器代码:AContext.Connection.IOHandler.ReadInt64; //收到5930114809340100608
19538十六进制是0x4C52
.
以十六进制表示的5930114809340100608 0x524C000000000000
.
注意相似性?
网络字节顺序中的19538是4C 52
16位整数,00 00 4C 52
而是32位整数.那只是2-4个字节,但是一个Int64
是8个字节,所以必须有另外4-6个字节,否则ReadInt64
不会返回.但是我们假设存在额外的00
字节(在这种情况下,您没有正确处理协议数据).为了ReadInt64
以网络字节顺序从8个字节返回5930114809340100608,它必须已经接收52 4C 00 00 00 00 00 00
,它不接近匹配19538作为网络字节顺序的16位或32位整数.
归档时间: |
|
查看次数: |
412 次 |
最近记录: |