如何将记录从主机转换成网络字节顺序(大端)? [英] How to convert a record from host to network byte order (big endian)?
本文介绍了如何将记录从主机转换成网络字节顺序(大端)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个记录:
Tconnecting = record
var
a:int64;
b:整数;
c:整数;
结束
我需要使用UDP协议发送到服务器
我填写
packet.a:= StrToInt64('0x1234567890');
packet.b:= 0;
packet.c:= RandomRange(1,9999999);
并发送
SetLength(send_data,sizeof(packet));
send_data:= RawToBytes(packet,SizeOf(packet));
udp.SendBuffer(make_it_big_endian(send_data)); < - 问题...网络字节顺序
或者我正在做某事错误?我需要发送bign endian数据包
pack(N *,int64,int,int); (这是PHP)
谢谢。
包的各个字节反转,例如,在您的使用条款中包含FMX.Types单元:
键入
Tconnecting = record
a :int64;
b:整数;
c:整数;
结束
procedure TForm1.Button1Click(Sender:TObject);
var
数据包,BEPacket:Tconnecting;
begin
packet.a:= $ 0102030405060708;
packet.b:= $ 01020304;
packet.c:= $ 05060708;
// big endian packet
BEPacket:= Packet;
ReverseBytes(@ BEPacket.a,SizeOf(BePacket.a));
ReverseBytes(@ BEPacket.b,SizeOf(BePacket.b));
ReverseBytes(@ BEPacket.c,SizeOf(BePacket.c));
Memo1.Lines.Add(Format('a:%16.16x =>%16.16x',[Packet.a,BEPacket.a]));
Memo1.Lines.Add(格式('b:%8.8x =>%8.8x',[Packet.b,BEPacket.b]));
Memo1.Lines.Add(Format('c:%8.8x =>%8.8x',[Packet.c,BEPacket.c]));
结束
I have a record:
Tconnecting = record
var
a: int64;
b: integer;
c: integer;
end;
which I need send to server using UDP protocol
I fill it
packet.a := StrToInt64('0x1234567890');
packet.b := 0;
packet.c := RandomRange(1, 9999999);
and sending it
SetLength(send_data, sizeof(packet));
send_data := RawToBytes(packet, SizeOf(packet));
udp.SendBuffer(make_it_big_endian(send_data)); <-- the question... "network byte order"
or maybe I'm doing something wrong? I need to send "bign endian" packet
pack("N*", int64, int, int); (this is in PHP)
Thanks.
解决方案
Assuming your code is running in a little-endian OS/Machine (like Windows/Intel), you can just reverse the individual bytes of your packet, for example, include the FMX.Types unit in your uses clause:
type
Tconnecting = record
a: int64;
b: integer;
c: integer;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Packet, BEPacket: Tconnecting;
begin
packet.a := $0102030405060708;
packet.b := $01020304;
packet.c := $05060708;
//big endian packet
BEPacket := Packet;
ReverseBytes(@BEPacket.a, SizeOf(BePacket.a));
ReverseBytes(@BEPacket.b, SizeOf(BePacket.b));
ReverseBytes(@BEPacket.c, SizeOf(BePacket.c));
Memo1.Lines.Add(Format('a: %16.16x => %16.16x', [Packet.a, BEPacket.a]));
Memo1.Lines.Add(Format('b: %8.8x => %8.8x', [Packet.b, BEPacket.b]));
Memo1.Lines.Add(Format('c: %8.8x => %8.8x', [Packet.c, BEPacket.c]));
end;
这篇关于如何将记录从主机转换成网络字节顺序(大端)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文