类型B02 =字节的数组[01..02];
...
var b:B02;
...
//这里我从tcp socket
读取socket.ReadBuffer(b,2);
问题是:如何将B02转换为整数?
答案 0 :(得分:8)
您可以在同一个内存位置声明Word / Smallint,如下所示:
var
b : B02;
myInt: smallint absolute B02;
然后,有没有什么特别的原因你不只是创建smallint并将其传递给ReadBuffer而不是数组?我不知道你正在使用什么类,但这看起来很像你从TStream中读取的方式,它会接受任何类型的变量,以及字节大小。为什么不将你的缓冲区声明为你正在寻找的整数类型并切断中间人?
答案 1 :(得分:4)
如果数据以“网络”顺序(最高字节优先)发送而不是“英特尔”顺序(最低字节优先),则可以自己做一些字节缩放。
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 :(得分:3)
你可以施展它:
var
a: array[01..02] of Byte;
i: Integer;
begin
i := PWORD(@a)^;
end;
或者如果您需要更改字节顺序:
i := Swap(PWORD(@a)^);