Delphi 如何将TBytes转换为RawByteString?

Delphi 如何将TBytes转换为RawByteString?,delphi,string,delphi-2009,Delphi,String,Delphi 2009,在Delphi 2009中,将声明为TBytes的字节数组转换为RawByteString的最佳方法是什么?这段代码实际上是有效的,也许有一种更快的方法(没有循环): 你可以考虑使用移动(未测试) 并对参数使用“const”,这样数组就不会被复制两次。记住要测试: 如果长度(字节)>0,则移动…将字节转换为RawByteString的最简单方法是使用SetString() 此外,如果将RawByteString分配给其他字符串类型,为了避免数据丢失,您应该为RawByteString分配一个代码

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


你可以考虑使用移动(未测试)

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

记住要测试:


如果长度(字节)>0,则移动…

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

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

function Convert(const Bytes: TBytes): RawByteString; 
begin
  SetString(Result, PAnsiChar(PByte(Bytes))^, Length(Bytes));
  SetCodePage(Result, ..., False);
end;
最好的办法是:

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

不要忘记对字节参数使用const,以便生成更快的代码。

SetLength()
将调用
ReallocMem
来调整现有RawByteString的大小,因此此版本可能不需要
move()
以前的数据,而不需要,例如,如果您在循环中调用它<代码>设置字符串(结果、平移(字节)、长度(字节)会更快。我认为使用
RawByteString
的意义在于,与
AnsiString
Utf8String
@blerontin
RawByteString
等类型相比,它缺少代码页信息,但在编译时它会继承任何分配给它的字符串的运行时字符集。还有一个字节数组有一个隐含的字符集,即使字节负载本身没有携带一个。正如我在回答中所说,
RawByteString
可以分配给其他字符串类型,因此它需要在其负载中携带一个有效的字符集,以便于正确分配以避免数据丢失这应该是对第一个字符串类型的注释(已接受)回答,我想。
function Convert(const Bytes: TBytes): RawByteString; 
begin
  SetString(Result, PAnsiChar(PByte(Bytes))^, Length(Bytes));
  SetCodePage(Result, ..., False);
end;
function Convert(const Bytes: TBytes): RawByteString; inline;
begin
  SetString(Result, PAnsiChar(pointer(Bytes)), length(Bytes));
end;