【问题标题】:How can I convert TBytes to RawByteString?如何将 TBytes 转换为 RawByteString?
【发布时间】:2009-04-21 15:47:53
【问题描述】:

在 Delphi 2009 中将声明为 TBytes 的字节数组转换为 RawByteString 的最佳方法是什么?这段代码确实有效,也许有更快的方法(无循环):

   function Convert(Bytes: TBytes): RawByteString; 
   var
     I: Integer;
   begin
     SetLength(Result, Length(Bytes));
     for I := 0 to ABytes - 1 do
       Result[I + 1] := AnsiChar(Bytes[I]);
   end;

【问题讨论】:

    标签: delphi string delphi-2009


    【解决方案1】:

    最好的方法是:

    function Convert(const Bytes: TBytes): RawByteString; inline;
    begin
      SetString(Result, PAnsiChar(pointer(Bytes)), length(Bytes));
    end;
    

    不要忘记将 const 用于 Bytes 参数,以便更快地生成代码。

    【讨论】:

      【解决方案2】:

      您可以考虑使用 move(未经测试)

      function Convert(const Bytes: TBytes): RawByteString; 
      begin
        SetLength(Result, Length(Bytes));
        Move(Bytes[0], Result[1], Length(Bytes))  
      end;
      

      并使用“const”作为参数,这样数组就不会被复制两次。

      【讨论】:

      • SetLength() 将调用ReallocMem 来调整现有RawByteString 的大小,所以这个版本可能不需要move() 以前的数据,不需要,例如如果你在一个循环中调用它。 SetString(Result,PAnsiChar(Bytes),length(Bytes) 会更快。
      【解决方案3】:

      将字节转换为RawByteString 的最简单方法是使用SetString()

      另外,如果RawByteString 曾经分配给其他字符串类型,为避免数据丢失,您应该为RawByteString 分配一个代码页,以便其字符数据正确转换为接收字符串的字符集:

      function Convert(const Bytes: TBytes): RawByteString; 
      begin
        SetString(Result, PAnsiChar(PByte(Bytes))^, Length(Bytes));
        SetCodePage(Result, ..., False);
      end;
      

      【讨论】:

      • 我认为使用RawByteString 的意义在于,与AnsiStringUtf8String 等类型相比,它缺少代码页信息。
      • @blerontin RawByteString编译时 缺少字符集,但它继承了分配给它的任何字符串的runtime 字符集。并且一个字节数组有一个隐含的字符集,即使字节有效载荷本身没有携带一个字符集。就像我在回答中所说的那样,RawByteString 可以分配给其他字符串类型,因此它需要在其有效负载中携带一个有效的字符集,以便于正确分配以避免数据丢失
      【解决方案4】:

      记得测试:

      IF 长度(字节)>0 THEN MOVE.....

      【讨论】:

      • 我猜这应该是对第一个(接受的)答案的评论。
      猜你喜欢
      • 2018-06-28
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多