Delphi - 将字节数组转换为字符串

6

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

procedure Form1.Convert(Collect: TBuff);
var 
   str: String;
begin
   str := SysUtils.StringOf(Collect);
end;

编译后,我收到了以下编译器错误的警告:

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

1个回答

11
你遇到的问题是你定义了自己的字节数组类型,就像这样:

type
  TBuff = array of Byte;

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

您需要做的第一件事是从程序中删除TBuff,改用TBytes。如果您继续使用TBuff,则会发现所有的字节数组代码都生活在自己的小世界中,无法与使用TBytes的库功能进行交互。因此,请逃离这个小世界,并将TBuff类型从代码中移除。

现在,如果要将字节数组转换为字符串,则需要提供编码信息。您选择了StringOf,但这个函数现在应被视为遗留函数。更好的方法是更加明确地进行转换并使用TEncoding

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

str := TEncoding.UTF8.GetString(ByteArray);

如果字节数组以本地 ANSI 编码进行编码,则写入:

str := TEncoding.ANSI.GetString(ByteArray);
在您的情况下,使用StringOf表示字节数组为ANSI编码,因此后面的示例是您所需的。

2
请注意,Delphi XE2添加了.ANSI属性到TEncoding中,您可以使用它来代替.Default(如果您在Mac OSX上,则现在返回UTF8)。在我知道字节数组是ANSI的情况下,我已经切换到使用.ANSI属性以更明确地表示(并且以防他们决定更改默认含义的情况)。 - MarkF
@MarkF 他们不会改变“Default”的含义,但是像你建议的那样明确地编写代码更好。我已经修改了它。谢谢。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接