在Delphi中将字节数组转换为整数

4

type B02 = array [01..02] of byte ;

...

var b : B02;

...

//在这里我从 TCP socket 读取数据

socket.ReadBuffer(b, 2);

问题是:如何将 B02 转换为整数?

请注意,HTML 标签已保留。
3个回答

8

您可以在同一内存位置声明一个Word/Smallint,像这样:

var
  b : B02;
  myInt: smallint absolute B02;

再说一遍,为什么您不直接创建smallint并将其传递给ReadBuffer而不是数组呢?我不知道您使用的是哪个类,但它看起来非常像从TStream中读取的方式,并且它将接受任何类型的变量以及字节数。为什么不只声明您所需要的整数类型的缓冲区并省略中间环节呢?


2
+1,谢谢您的阅读。除非B02包含字符数据,否则任何解决方案都可以回答这个问题。 - skamradt
1
可能网络上的数据是以网络字节顺序存储的,而不是Intel字节顺序。 - gabr
@gabr:它应该是网络顺序,其他任何方式都会违反标准。 - mghie
1
@mghie:标准规范算什么,如果我的应用程序在两端,我会按我想要的任意方式发送数据。 - gabr
1
@Marco:如果服务器或客户端有任何可能在PC以外的平台上运行,那么对于协议数据来说,使用文本格式或网络字节顺序是很常见的做法。我认为这已经成为了一种标准。例如,可以查看RFC文件。 - mghie
显示剩余2条评论

5
你可以直接转换它:
var
  a: array[01..02] of Byte;
  i: Integer;
begin
  i := PWORD(@a)^;
end;

或者如果您需要更改字节顺序:

  i := Swap(PWORD(@a)^);

4
如果数据是按照“网络”顺序(最高字节在前)而不是“Intel”顺序(最低字节在前)传输的,您可以自己进行一些字节重排。
uses
  SysUtils;

var
  b: B02;
  w: word; //two bytes represent a word, not an integer

socket.ReadBuffer(b, 2);
WordRec(w).Hi := b[1];
WordRec(w).Lo := b[2];

Mghie在评论中提出了以下方法(我同意他的看法):

uses Winsock;

var
  w: word;

socket.ReadBuffer(w, 2);
w := ntohs(w);

2
+1,但我仍然不喜欢隐含的假设处理器为小端序。代码应该读取一个字,调用ntohs()并强制转换为SmallInt,这样它就可以在任何处理器上工作(使用FPC时)。 - mghie
1
@mghie:你说得完全正确。但我仍然总是按照英特尔的方式编写它。这个习惯很难改掉 :( - gabr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接