【问题标题】:Delphi - Convert byte array to stringDelphi - 将字节数组转换为字符串
【发布时间】:2010-10-07 12:42:56
【问题描述】:

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

【问题讨论】:

    标签: delphi


    【解决方案1】:

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

    SetString(AnsiStr, PAnsiChar(@ByteArray[0]), LengthOfByteArray);
    

    如果您有UnicodeString,那么您需要将长度参数减半,因为它测量的是字符,而不是字节:

    SetString(UnicodeStr, PWideChar(@ByteArray[0]), LengthOfByteArray div 2);
    

    另请参阅Converting TMemoryStream to String in Delphi 2009

    【讨论】:

    • 我使用 Length(ByteArray) 得到了字节数组的长度。
    • @Sergey、AnsiStrintgTUnicodeString 都有接受 char* 和长度的构造函数。 std::string 也是如此,它也有一个用于相同目的的 assign 方法。
    • 建议不易出错SetString(UnicodeStr, PWideChar(@ByteArray[0]), LengthOfByteArray div SizeOf(PWideChar^));
    【解决方案2】:

    我不确定 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 功能完美运行。就是需要声明 var i。谢谢你!
    • 如果您只想渲染数据,您可以使用 Copy(Memory) 将其复制到 AnsiString
    • ASCII 字符集中只有 127 个字符。也许您指的是 Windows-1252。
    【解决方案3】:
    var
       LString : string;
       LBytes : TArray<byte>;
    begin    
       LBytes := TArray<byte>.Create($01, $02, $03);
       LString := TEncoding.ANSI.GetString(ABytes);
    end;
    

    GetString() 是 GetBytes() 的逆运算。

    【讨论】:

      【解决方案4】:

      我认为还有另一种很好的方法可以将字节数组转换为字符串 - IdGlobal 中包含一个名为 BytesToString 的 Indy 函数。它还允许您为字符串指定StartIndexLengthTEncoding。我用过好几次了,觉得非常好用。

      【讨论】:

        【解决方案5】:

            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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-11
          • 1970-01-01
          • 2018-10-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多