交换 Delphi 中的字节顺序

Swapping order of bytes in Delphi

我对 bite 数组和 big/little endians 不是很熟悉,但我需要将一个整数值反向写入字节数组,但我不知道如何在 Delphi 代码。 C# 有 BitConverter.Reverse 方法,它更容易,在 Delphi 中是否有任何等效的方法? 到目前为止,这是我的代码:

x := 1500977838953;
setLength(byteArray, 8);
Move(x, byteArray[2], SizeOf(x));
showMessage(ByteToHex(byteArray));

ByteToHex 是一种 returns 十六进制字符串的方法,这样我就可以读取顺序正确的字节。我得到的结果是:0000693B40795D01 但我需要它是:00-00-01-5D-79-40-3B-69

有什么办法可以实现吗?

编辑:

function ByteToHex(b: array of byte): String;
const HexSymbols = '0123456789ABCDEF';
var i: integer;
begin
  SetLength(Result, 2*Length(b));
  for i :=  0 to Length(b)-1 do begin
    Result[1 + 2*i + 0] := HexSymbols[1 + b[i] shr 4];
    Result[1 + 2*i + 1] := HexSymbols[1 + b[i] and [=12=]F];
  end;
end;

这是一个如何使用 ReverseBytes() 程序的例子:

program Project20;
{$APPTYPE CONSOLE}
uses
  System.SysUtils;

procedure ReverseBytes(Source, Dest: Pointer; Size: Integer);
begin
  Dest := PByte(NativeUInt(Dest) + Size - 1);
  while (Size > 0) do
  begin
    PByte(Dest)^ := PByte(Source)^;
    Inc(PByte(Source));
    Dec(PByte(Dest));
    Dec(Size);
  end;
end;

var x,y : Int64;

begin
  x := 1500977838953;
  WriteLn(x);
  ReverseBytes(Addr(x),Addr(y),SizeOf(x)); // Or ReverseBytes(@x,@y,SizeOf(x));
  WriteLn(IntToHex(x));
  WriteLn(IntToHex(y));
  ReadLn;
end.

输出:

1500977838953
0000015D79403B69
693B40795D010000

要获取变量的地址,请使用 Addr() 函数或 @ 运算符。 结果是一个 64 位整数,所有字节的顺序相反,如输出所示。

还有其他方法可以交换变量的字节顺序。例如搜索 bswap