【问题标题】:Delphi (XE6) : Array of Byte to TStringListDelphi(XE6):字节数组到 TStringList
【发布时间】:2014-09-07 13:40:33
【问题描述】:

我有一个返回字节动态数组的函数

type
  TMyEncrypt = Array of Byte;
  TMyDecrypt = Array of Byte;

function decrypt(original: TMyEncrypt) : TMyDecrypt;

返回的动态数组 TMyDecrypt 的内容是带有 CRLF 的标准文本。

如何将其加载到以 CRLF 作为分隔符的 TStringList 中,而不先将其保存到临时文件中?

编辑:返回的字节数组包含 unicode 编码字符

【问题讨论】:

  • 你需要知道文本编码
  • 嗨大卫,刚刚添加为编辑(unicode)
  • StringList.Text := PChar(decrypt(MyEncrypt)); 假设字节数组是小端序,并带有适当的空终止符。
  • 假设解密后的字节是 UTF-16,否则这样的类型转换将不起作用。
  • @Remy 由于问题表明数据是 UTF-16 编码的,我认为没有必要假设任何事情

标签: arrays delphi type-conversion delphi-xe6 tstringlist


【解决方案1】:

将字节数组解码为字符串,然后赋值给字符串列表的Text属性。

var
  Bytes: TBytes;
  StringList: TStringList;
....
StringList.Text := TEncoding.Unicode.GetString(Bytes);

注意TBytes 的使用,这是用于保存动态字节数组的标准类型。出于兼容性原因,使用TBytes 是有意义的。这样,您的数据可以由其他 RTL 和库代码处理。通过使用TEncoding,我们可以立即利用这一事实。

您可以使用SetString,正如我最初的回答所建议的那样:

var
  Text: string;
  Bytes: TBytes;
  StringList: TStringList;
....
SetString(Text, PChar(Bytes), Length(Bytes) div SizeOf(Char)));
StringList.Text := Text;

我个人更喜欢使用TEncoding,因为它对所使用的编码非常明确。

如果您的文本以 null 结尾,那么您可以使用:

StringList.Text := PChar(Bytes);

同样,我更愿意明确说明编码。而且我可能对我的数据没有以某种方式被空终止有点偏执。

您可能会发现 UTF-8 比 UTF-16 更有效。

【讨论】:

  • 非常感谢 David... 问题是 UTF-8 或 UTF-16 不在我的“手中”,因为我不是我“解析”的文件的创建者
  • 请注意,我编辑了答案以使其更简洁。比起原来的 SetString 版本,我更喜欢 TEncoding。
  • @AndreasHinderberger:您必须知道解密字节的编码才能将它们正确解码为 UTF-16 字符串以供 TStringList 使用。如果不知道字节编码,就无法解码字节。
  • @Remy 我们已经这样做了。我说了同样的话,安德烈亚斯提供了信息。
猜你喜欢
  • 2014-07-26
  • 1970-01-01
  • 2015-10-14
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2012-12-05
  • 2014-10-17
相关资源
最近更新 更多