我想知道如何在Delphi中将big-endian数字转换为本机数字。我正在移植一些C ++代码:
unsigned long blockLength = *blockLengthPtr++ << 24;
blockLength |= *blockLengthPtr++ << 16;
blockLength |= *blockLengthPtr++ << 8;
blockLength |= *blockLengthPtr;
unsigned long dataLength = *dataLengthPtr++ << 24;
dataLength |= *dataLengthPtr++ << 16;
dataLength |= *dataLengthPtr++ << 8;
dataLength |= *dataLengthPtr;
我不熟悉C ++,所以我不明白这些操作符是做什么的。
答案 0 :(得分:18)
Andreas的回答是一个很好的例子,说明如何在纯粹的pascal中做到这一点,但它仍然看起来有点尴尬,就像C ++代码一样。这实际上可以在单个汇编指令中完成,但这取决于您使用的是32位还是16位整数:
function SwapEndian32(Value: integer): integer; register;
asm
bswap eax
end;
function SwapEndian16(Value: smallint): smallint; register;
asm
rol ax, 8
end;
答案 1 :(得分:3)
要颠倒位的顺序:
procedure SwapEndiannessOfBits(var Value: cardinal);
var
tmp: cardinal;
i: Integer;
begin
tmp := 0;
for i := 0 to 8*sizeof(Value) - 1 do
inc(tmp, ((Value shr i) and $1) shl (8*sizeof(Value) - i - 1));
Value := tmp;
end;
要颠倒字节的顺序:
procedure SwapEndiannessOfBytes(var Value: cardinal);
var
tmp: cardinal;
i: Integer;
begin
tmp := 0;
for i := 0 to sizeof(Value) - 1 do
inc(tmp, ((Value shr (8*i)) and $FF) shl (8*(sizeof(Value) - i - 1)));
Value := tmp;
end;
我认为最后一个是您正在寻找的。但是,最有可能的是更快更优雅的解决方案。
免责声明:我可能完全错了。此刻我感到有些困惑。希望其他人会看到这个问题,并提供更明确的答案!