Delphi - 将字节数组转换为字符串

sev*_*ven 25 delphi

如何在Delphi中将字节数组转换为字符串(base 256)?

Rob*_*edy 41

使用内置SetString命令.它将字符串设置为所需的长度并复制字节.数组不需要以空值终止.实际上,如果数组中有零值字节,它们将正确地出现在字符串中; 他们不会终止字符串.

SetString(AnsiStr, PAnsiChar(@ByteArray[0]), LengthOfByteArray);
Run Code Online (Sandbox Code Playgroud)

如果你有一个UnicodeString,那么你需要将length参数减半,因为它测量的是字符,而不是字节:

SetString(UnicodeStr, PWideChar(@ByteArray[0]), LengthOfByteArray div 2);
Run Code Online (Sandbox Code Playgroud)

另请参见在Delphi 2009中将TMemoryStream转换为String.

  • 我使用Length(ByteArray)得到了字节数组的长度. (14认同)

him*_*elf 10

我不确定Base256是什么意思.如果要获取数据的十六进制表示,请使用:

function bintostr(const bin: array of byte): string;
const HexSymbols = '0123456789ABCDEF';
var i: integer;
begin
  SetLength(Result, 2*Length(bin));
  for i :=  0 to Length(bin)-1 do begin
    Result[1 + 2*i + 0] := HexSymbols[1 + bin[i] shr 4];
    Result[1 + 2*i + 1] := HexSymbols[1 + bin[i] and $0F];
  end;
end;
Run Code Online (Sandbox Code Playgroud)

如果你想只是将数据呈现为字符串(这不会改变内容!),对于每个数据字节,你将获得带有该代码的单个ASCII符号,

function bintoAscii(const bin: array of byte): AnsiString;
var i: integer;
begin
  SetLength(Result, Length(bin));
  for i := 0 to Length(bin)-1 do
    Result[1+i] := AnsiChar(bin[i]);
end;
Run Code Online (Sandbox Code Playgroud)

  • 如果您只想渲染数据,可以使用Copy(Memory)将其复制到AnsiString (2认同)
  • ASCII字符集中只有127个字符.也许你指的是Windows-1252. (2认同)

Edu*_*rdo 6

var
   LString : string;
   LBytes : TArray<byte>;
begin    
   LBytes := TArray<byte>.Create($01, $02, $03);
   LString := TEncoding.ANSI.GetString(ABytes);
end;
Run Code Online (Sandbox Code Playgroud)

GetString() 是 GetBytes() 的反向操作。