首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GStack.HostToNetwork输入类型-短?

GStack.HostToNetwork输入类型-短?
EN

Stack Overflow用户
提问于 2012-11-23 02:01:11
回答 1查看 364关注 0票数 0
  1. 如何将"a“变量传递到HostToNetwork()?需要某种方式改变它..。
  2. 以及如何插入“一个”变量,这个HEX代码? var a:array0 0.19 of of;h: string;h =:‘714BD6D36D4944F4E4F943CB03D128EA5C372F6’;GStack.HostToNetwork(a)

来自IdStack.pas:

代码语言:javascript
复制
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;

谢谢

编辑:

代码语言:javascript
复制
    h := '714BD6D36D4944F4E4F943CB03D128EA5C372FF6';
    for x := 0 to 19 do
    begin
      a[x] := StrToInt('$'+Copy(h, x, 2));
    end;

对吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-23 05:48:27

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

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

代码语言:javascript
复制
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;

代码语言:javascript
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13522284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档