You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi实现字节序反转 解决整数转字节数组大小端转换问题

解决方案

字节序反转实现(等效C# BitConverter.Reverse)

Delphi没有直接同名的内置方法,你可以通过以下通用方法实现任意长度数据的字节序反转,功能和C#的BitConverter.Reverse完全一致:

procedure ReverseBytes(Source, Dest: Pointer; Size: Integer);
var
  I: Integer;
  PSource, PDest: PByte;
begin
  PSource := PByte(Source);
  PDest := PByte(Dest);
  for I := 0 to Size - 1 do
  begin
    PDest[I] := PSource[Size - 1 - I];
  end;
end;

如果你使用的是XE及以上版本的Delphi,针对64位整数也可以直接调用内置的SwapEndian函数,无需自己实现反转逻辑。

适配你需求的代码修改

1. 修改十六进制转换方法,支持分隔符

你原有的ByteToHex方法只输出连续的十六进制字符,修改后可自定义分隔符:

function ByteToHex(b: array of byte; Separator: Char = #0): String;
const HexSymbols = '0123456789ABCDEF';
var i: integer;
  BaseIdx: Integer;
begin
  if Length(b) = 0 then 
  begin
    Result := '';
    Exit;
  end;
  // 计算结果长度:无分隔符时每个字节占2位,有分隔符时每个字节占3位,最后少1个分隔符
  if Separator = #0 then
    SetLength(Result, 2 * Length(b))
  else
    SetLength(Result, 3 * Length(b) - 1);

  for i := 0 to Length(b) - 1 do 
  begin
    BaseIdx := 1 + 2 * i;
    if Separator <> #0 then
      BaseIdx := BaseIdx + i;
    // 插入分隔符
    if (Separator <> #0) and (i > 0) then
      Result[BaseIdx - 1] := Separator;
    // 写入十六进制字符
    Result[BaseIdx] := HexSymbols[1 + b[i] shr 4];
    Result[BaseIdx + 1] := HexSymbols[1 + b[i] and $0F];
  end;
end;

2. 业务逻辑代码调整

先反转整数的字节序,再写入字节数组:

var
  x: Int64;
  byteArray: TBytes;
  reversedX: Int64;
begin
  x := 1500977838953;
  SetLength(byteArray, 8);
  // 反转64位整数的字节序
  ReverseBytes(@x, @reversedX, SizeOf(x));
  // 写入字节数组的指定偏移位置
  Move(reversedX, byteArray[2], SizeOf(x));
  // 输出带横杠分隔的十六进制字符串
  ShowMessage(ByteToHex(byteArray, '-'));
end;

运行上述代码后输出结果就是你需要的00-00-01-5D-79-40-3B-69。

补充说明

  • x86、x64架构下Delphi默认使用小端序存储整数,你需求的存储格式为大端序(网络字节序),上述反转逻辑就是实现小端到大端的转换。
  • ReverseBytes是通用实现,支持16位、32位、64位等任意长度数据的字节序反转,可直接复用。

内容的提问来源于stack exchange,提问作者q1werty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:54:00