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
相关产品推荐
相关产品推荐

