0
  1. 如何将“a”变量传递给 HostToNetwork() ?需要以某种方式转换它..
  2. 以及如何插入“a”变量,这个十六进制代码?

    var
    a : array[0..19] of Shortint;
    h : string;
    
    h =: '714BD6D36D4944F4E4F943CB03D128EA5C372FF6';
    
    GStack.HostToNetwork(a)
    

来自 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;

正确的 ?

4

1 回答 1

2

Shortint大小为 1 个字节,因此根本不受字节序的影响。GStack.HostToNetwork()andGStack.NetworkToHost()方法只对多字节整数进行操作。所以使用本例中的方法没有意义GStack。您正在声明一个包含 20 个原始字节的数组。您需要先将这些字节拆分为整数,然后才能对其进行转换。拆分它们后,您可以GStack根据需要将它们单独传递。

根据您之前的问题,您实际上是在处理整数记录,而不是原始字节。您需要在将记录编码为原始字节之前将整数转换为网络字节顺序,然后在您首先将原始字节解码为记录之后将整数转换为主机字节顺序。例如:

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;
于 2012-11-23T05:48:27.973 回答