如何将记录从主机转换成网络字节顺序(大端)? [英] How to convert a record from host to network byte order (big endian)?

查看:110
本文介绍了如何将记录从主机转换成网络字节顺序(大端)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个记录:

  Tconnecting = record 
var
a:int64;
b:整数;
c:整数;
结束

我需要使用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)); < - 问题...网络字节顺序

或者我正在做某事错误?我需要发送bign endian数据包

  pack(N *,int64,int,int); (这是PHP)

谢谢。

包的各个字节反转,例如,在您的使用条款中包含FMX.Types单元:

 键入
Tconnecting = record
a :int64;
b:整数;
c:整数;
结束

procedure TForm1.Button1Click(Sender:TObject);
var
数据包,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(格式('b:%8.8x =>%8.8x',[Packet.b,BEPacket.b]));
Memo1.Lines.Add(Format('c:%8.8x =>%8.8x',[Packet.c,BEPacket.c]));
结束


I have a record:

  Tconnecting = record
  var
    a: int64;
    b: integer;
    c: integer;
  end;

which I need send to server using UDP protocol

I fill it

  packet.a := StrToInt64('0x1234567890');
  packet.b := 0;
  packet.c := RandomRange(1, 9999999);

and sending it

  SetLength(send_data, sizeof(packet));
  send_data := RawToBytes(packet, SizeOf(packet));
  udp.SendBuffer(make_it_big_endian(send_data)); <-- the question... "network byte order"

or maybe I'm doing something wrong? I need to send "bign endian" packet

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

Thanks.

解决方案

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;

这篇关于如何将记录从主机转换成网络字节顺序(大端)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆