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

29
如何在 Delphi 中将字节数组转换为字符串(基于256进制)?
5个回答

47

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

SetString(AnsiStr, PAnsiChar(@ByteArray[0]), LengthOfByteArray);
如果你有一个UnicodeString,那么你需要将长度参数减半,因为它测量的是字符而不是字节:
SetString(UnicodeStr, PWideChar(@ByteArray[0]), LengthOfByteArray div 2);

请参阅将TMemoryStream转换为字符串的方法(Delphi 2009)


14
使用 Length(ByteArray) 可以获取字节数组的长度。 - seveleven
1
@Sergey,AnsiStringTUnicodeString都有接受char*和长度的构造函数。std::string也有相同目的的assign方法。 - Rob Kennedy
建议使用以下代码 SetString(UnicodeStr, PWideChar(@ByteArray[0]), LengthOfByteArray div SizeOf(PWideChar^)); 来减少错误率。 - Dominik Gebhart

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;
如果您只想将数据呈现为字符串(这不会改变内容!),其中对于每个字节的数据,您将获得一个具有该代码的单个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;

Base 256字符串是ASCII字符串,如您正确理解它是Delphi中的Ansistring/String。函数bintoAscii工作得很好。只需要声明变量i即可。谢谢! - seveleven
2
如果您只想呈现数据,可以使用Copy(Memory)将其复制到AnsiString中。 - Remko
3
ASCII字符集只有127个字符。也许你指的是Windows-1252字符集。 - Andreas Rejbrand

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

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

2

我认为还有另一种很好的将字节数组转换为字符串的方式 - 使用Indy函数IdGlobal中包含的BytesToString。它还允许您指定StartIndexLengthTEncoding参数来生成您需要的字符串。我已经多次使用它并且觉得非常有用。


-1

    function bintostr_r(const bin: array of byte): string;
    var i,j:integer;
        res:string ;
    begin
    res:='';
        for i:=0 to length(bin)-1 do
        begin
           for j:=1 to 8 do
           res:=Inttostr( ((bin[i] shr (j - 1)) and ((1 shl 1) - 1)) ) +res  ;
        end;
        result:=res;

    end;



procedure TForm1.FormCreate(Sender: TObject);
var OrigStat: array [1..6] of byte;  
  res:integer;
begin

  OrigStat[1]:=253; // 11111101
  OrigStat[2]:=252;
  OrigStat[3]:=251;
  OrigStat[4]:=250;
  OrigStat[5]:=249;
  OrigStat[6]:=248;
  Edit9.text:=bintostr_r(OrigStat);
end;


result => 111110001111100111111010111110111111110011111101


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接