如何将big-endian数字转换为原生数字delphi

时间:2010-06-17 20:20:59

标签: delphi endianness

我想知道如何在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 ++,所以我不明白这些操作符是做什么的。

2 个答案:

答案 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;

我认为最后一个是您正在寻找的。但是,最有可能的是更快更优雅的解决方案。

免责声明:我可能完全错了。此刻我感到有些困惑。希望其他人会看到这个问题,并提供更明确的答案!