type B02 = array [01..02] of byte ;
...
var b : B02;
...
//在这里我从 TCP socket 读取数据
socket.ReadBuffer(b, 2);
问题是:如何将 B02 转换为整数?
请注意,HTML 标签已保留。type B02 = array [01..02] of byte ;
...
var b : B02;
...
//在这里我从 TCP socket 读取数据
socket.ReadBuffer(b, 2);
问题是:如何将 B02 转换为整数?
请注意,HTML 标签已保留。您可以在同一内存位置声明一个Word/Smallint,像这样:
var
b : B02;
myInt: smallint absolute B02;
再说一遍,为什么您不直接创建smallint并将其传递给ReadBuffer而不是数组呢?我不知道您使用的是哪个类,但它看起来非常像从TStream中读取的方式,并且它将接受任何类型的变量以及字节数。为什么不只声明您所需要的整数类型的缓冲区并省略中间环节呢?
var
a: array[01..02] of Byte;
i: Integer;
begin
i := PWORD(@a)^;
end;
或者如果您需要更改字节顺序:
i := Swap(PWORD(@a)^);
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);
ntohs()
并强制转换为SmallInt
,这样它就可以在任何处理器上工作(使用FPC时)。 - mghie