交换 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
。
我对 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
。