来自IdStack.pas:
function HostToNetwork(AValue: Word): Word; overload; virtual; abstract;
function HostToNetwork(AValue: LongWord): LongWord; overload; virtual; abstract;
function HostToNetwork(AValue: Int64): Int64; overload; virtual; abstract;
function HostToNetwork(const AValue: TIdIPv6Address): TIdIPv6Address; overload; virtual;谢谢
编辑:
h := '714BD6D36D4944F4E4F943CB03D128EA5C372FF6';
for x := 0 to 19 do
begin
a[x] := StrToInt('$'+Copy(h, x, 2));
end;对吗?
发布于 2012-11-23 05:48:27
Shortint大小为1字节,因此完全不受endian的影响。GStack.HostToNetwork()和GStack.NetworkToHost()方法只对多字节整数进行操作.因此,在本例中使用GStack方法是没有意义的。您正在声明一个20个原始字节的数组。您需要先将这些字节拆分为整数,然后才能将它们转换。一旦拆分了它们,就可以根据需要将它们分别传递给GStack。
根据您的earlier question,您实际上是在处理整数的记录,而不是原始字节。在将记录编码为原始字节之前,需要将整数转换为网络字节顺序,然后在首先将原始字节解码为记录之后,将整数转换为宿主字节顺序。例如:
type
Tconnecting = packed record
a: int64;
b: integer;
c: integer;
end;
var
packet: Tconnecting;
send_data: TIdBytes;
begin
packet.a := $1234567890;
packet.b := 0;
packet.c := RandomRange(1, 9999999);
packet.a := GStack.HostToNetwork(packet.a);
packet.b := Integer(GStack.HostToNetwork(LongWord(packet.b)));
packet.c := Integer(GStack.HostToNetwork(LongWord(packet.c)));
send_data := RawToBytes(packet, SizeOf(packet));
udp.SendBuffer(send_data);
end;。
var
Treply = packed record
c: integer;
b: integer;
a: int64;
end;
var
packet: Tconnecting;
received_data: TIdBytes;
begin
SetLength(received_data, SizeOf(Treply));
if udp.ReceiveBuffer(received_data) = SizeOf(Treply) then
begin
BytesToRaw(received_data, packet, SizeOf(Treply));
packet.a := GStack.NetworkToHost(packet.a);
packet.b := Integer(GStack.NetworkToHost(LongWord(packet.b)));
packet.c := Integer(GStack.NetworkToHost(LongWord(packet.c)));
// use packet as needed ...
end;
end;https://stackoverflow.com/questions/13522284
复制相似问题