我有记录:
Tconnecting = record
var
a: int64;
b: integer;
c: integer;
end;
我需要使用 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)); <-- the question... "network byte order"
或者也许我做错了什么?我需要发送"比根字节序"数据包
pack("N*", int64, int, int); (this is in PHP)
谢谢。
您实际要做的是从主机字节顺序转换为网络字节顺序。所有标准套接字库都提供了帮助程序函数来执行此操作。
例如,Winsock提供htons,htonl等。在相反的方向上,你有 ntohs、ntohl 等。如果您使用的是 Indy,则等效函数为 GStack.HostToNetwork
和 GStack.NetworkToHost
.
应将每个字段序列化为字节流,每个字段由相应的 hton* 函数转换。然后,您可以将字节流放在线路上。
假设您的代码在小端操作系统/机器(如Windows/Intel)中运行,您可以反转数据包的各个字节,例如,包括FMX。使用条款中的类型单位:
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;