如何使用 Delphi 将字节数组转换为字符串?

How do I convert an array of bytes to string with Delphi?

我正在用Delphi开发一个项目,我想将字节数组转换为字符串类型。我该怎么办?

示例 C# 代码:

private void ListenerOnDataTransmit(DataTransmitEventArgs e)
{
    transmittedMsg = BitConverter.ToString(e.TransmittedBytes, 0, e.TransmittedBytes.Length);
    try { Invoke(new EventHandler(UpdateTransmittedMessagesListView)); }
    catch { }
}

BitConverter.ToString() 方法“将指定字节数组的每个元素的数值转换为其等效的十六进制字符串表示形式。”您可以在 Delphi 7 中通过在循环中使用 SysUtils.IntToHex() 函数手动执行相同的操作,例如:

uses
  ..., SysUtils;

var
  bytes: array of byte;
  s: string;
  i: Integer;
begin
  bytes := ...;
  s := '';
  if bytes <> nil then
  begin
    s := IntToHex(bytes[0], 2);
    for i := 1 to High(bytes) do
      s := s + '-' + IntToHex(bytes[i], 2);
  end;
end;

我怀疑您想要一个接受字节数组(或指向字节的原始指针)和 returns 包含十六进制形式数据的字符串的函数。

我总是使用我的以下例程来执行此操作:

function BytesToString(ABuf: PByte; ALen: Cardinal): string; overload;
const
  HexDigits: array[0..$F] of Char = '0123456789ABCDEF';
var
   i: Integer;
begin
   if ALen = 0 then
   begin
     Result := '';
     Exit;
   end;
   SetLength(Result, 3 * ALen - 1);
   Result[1] := HexDigits[ABuf^ shr 4];
   Result[2] := HexDigits[ABuf^ and [=10=]F];
   for i := 1 to ALen - 1 do
   begin
     Inc(ABuf);
     Result[3*i + 0] := ' ';
     Result[3*i + 1] := HexDigits[ABuf^ shr 4];
     Result[3*i + 2] := HexDigits[ABuf^ and [=10=]F];
   end;
end;

type
  TByteArray = array of Byte;

function BytesToString(ABytes: TByteArray): string; overload;
begin
  Result := BytesToString(PByte(ABytes), Length(ABytes));
end;

第一个重载采用原始指针和长度,而第二个重载采用动态字节数组。

这是一个非常快速的实现,因为我不使用字符串连接(这需要不断的堆重新分配)。


以上代码是专门为旧的Delphi 7 编译器和RTL 编写的。现代版本看起来更像这样:

function BytesToString(ABuf: PByte; ALen: Cardinal): string; overload;
const
  HexDigits: array[0..$F] of Char = '0123456789ABCDEF';
var
   i: Integer;
begin
   if ALen = 0 then
    Exit('');
   SetLength(Result, 3 * ALen - 1);
   Result[1] := HexDigits[ABuf[0] shr 4];
   Result[2] := HexDigits[ABuf[0] and [=11=]F];
   for i := 1 to ALen - 1 do
   begin
     Result[3*i + 0] := ' ';
     Result[3*i + 1] := HexDigits[ABuf[i] shr 4];
     Result[3*i + 2] := HexDigits[ABuf[i] and [=11=]F];
   end;
end;

function BytesToString(ABytes: TArray<Byte>): string; overload;
begin
  Result := BytesToString(PByte(ABytes), Length(ABytes));
end;

以上代码使用 space 字符对每个字节进行分组。当然,您可能不希望这样,但是不分组就可以完成它是一项更简单的任务,所以我将把它留作练习。