为什么我使用indy发送了一个不同的int?

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

Rem*_*eau 8

您没有考虑字节序或字节大小.

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 5216位整数,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位整数.