Delphi - Byte数组到字符串

sta*_*ker 5 arrays delphi string byte

在我的Delphi VCL表单应用程序中,我有一个具有TBuff参数的程序(在字节数组之前定义).在此过程中,我必须将参数转换为字符串.

procedure Form1.Convert(Collect: TBuff);
var 
   str: String;
begin
   str := SysUtils.StringOf(Collect);
end;
Run Code Online (Sandbox Code Playgroud)

编译之后,我被警告存在这个编译器错误:

不兼容的类型:'System.TArray <System.TByte>'和'TBuff'

Dav*_*nan 8

您遇到的问题是您已经定义了自己的字节数组类型,如下所示:

type
  TBuff = array of Byte;
Run Code Online (Sandbox Code Playgroud)

您的这种私有类型与其他字节数组类型不兼容.大多数使用字节数组的RTL函数都使用TBytes声明为的RTL类型TArray<Byte>.

您要做的第一件事就是TBuff从您的程序中删除而不是使用TBytes.如果继续使用,TBuff您将发现所有字节数组代码都存在于自己的贫民窟中,无法与使用的库功能进行交互TBytes.所以,逃离贫民区,并TBuff从存在中删除你的类型.

现在,为了将字节数组转换为字符串,您需要提供编码信息来执行此操作.您选择了StringOf哪些应该被视为遗留功能.最好在转换和使用时更明确TEncoding.

例如,如果字节数组是UTF-8,则写入:

str := TEncoding.UTF8.GetString(ByteArray);
Run Code Online (Sandbox Code Playgroud)

如果字节数组是用本地ANSI编码编码的,那么你写:

str := TEncoding.ANSI.GetString(ByteArray);
Run Code Online (Sandbox Code Playgroud)

在您的情况下,使用StringOf表示字节数组是ANSI编码的,因此后一个示例是您需要的.

  • 请注意,Delphi XE2将.ANSI属性添加到TEncoding,您可以使用而不是.Default(如果您使用的是Mac OSX,现在会返回UTF8.)如果我知道字节数组是ANSI,我会切换到使用.ANSI属性更明确(以及他们决定更改默认含义的情况.) (2认同)