1

私は記録を持っています:

  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"

または多分私は何か間違ったことをしていますか?「bignエンディアン」パケットを送信する必要があります

pack("N*", int64, int, int); (this is in PHP)

ありがとう。

4

2 に答える 2

4

実際に行っているのは、ホストバイトオーダーからネットワークバイトオーダーへの変換です。すべての標準ソケットライブラリは、それを行うためのヘルパー関数を提供します。

たとえば、Winsockはhtons、htonlなどを提供します。反対方向にはntohs、ntohlなどがあります。Indyを使用している場合、同等の関数はとGStack.HostToNetworkですGStack.NetworkToHost

各フィールドを適切なhton*関数によって変換して、各フィールドをバイトストリームにシリアル化する必要があります。次に、バイトストリームをネットワークに配置できます。

于 2012-11-22T07:02:36.877 に答える
1

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;
于 2012-11-22T06:33:02.107 に答える