0
  1. 「a」変数を HostToNetwork() に渡す方法は? どうにかして変換する必要があります..
  2. そして、このHEXコードを「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()およびメソッドはGStack.NetworkToHost()、代わりにマルチバイト整数でのみ動作します。GStackしたがって、この例のメソッドを使用しても意味がありません。20 raw バイトの配列を宣言しています。それらを変換する前に、まずこれらのバイトを整数に分割する必要があります。それらを分割したらGStack、必要に応じて個別に渡すことができます。

以前の質問に基づいて、実際には生のバイトではなく整数のレコードを扱っています。レコードを raw バイトにエンコードする前に整数をネットワーク バイト オーダーに変換し、最初にrawバイトをレコードにデコードした後で整数をホスト バイト オーダーに変換する必要があります。例えば:

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 に答える