【发布时间】:2010-10-07 12:42:56
【问题描述】:
如何在 Delphi 中将字节数组转换为字符串(以 256 为基数)?
【问题讨论】:
标签: delphi
如何在 Delphi 中将字节数组转换为字符串(以 256 为基数)?
【问题讨论】:
标签: delphi
使用内置的SetString 命令。它将字符串设置为所需的长度并复制字节。数组不需要以空值结尾。事实上,如果数组中有零值字节,它们将正确地出现在字符串中;他们不会终止字符串。
SetString(AnsiStr, PAnsiChar(@ByteArray[0]), LengthOfByteArray);
如果您有UnicodeString,那么您需要将长度参数减半,因为它测量的是字符,而不是字节:
SetString(UnicodeStr, PWideChar(@ByteArray[0]), LengthOfByteArray div 2);
【讨论】:
AnsiStrintgT 和 UnicodeString 都有接受 char* 和长度的构造函数。 std::string 也是如此,它也有一个用于相同目的的 assign 方法。
SetString(UnicodeStr, PWideChar(@ByteArray[0]), LengthOfByteArray div SizeOf(PWideChar^));
我不确定 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;
【讨论】:
var
LString : string;
LBytes : TArray<byte>;
begin
LBytes := TArray<byte>.Create($01, $02, $03);
LString := TEncoding.ANSI.GetString(ABytes);
end;
GetString() 是 GetBytes() 的逆运算。
【讨论】:
我认为还有另一种很好的方法可以将字节数组转换为字符串 - IdGlobal 中包含一个名为 BytesToString 的 Indy 函数。它还允许您为字符串指定StartIndex、Length 和TEncoding。我用过好几次了,觉得非常好用。
【讨论】:
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
【讨论】: