如何将字符串转换为字节数组和返回数组

时间:2014-01-29 21:06:37

标签: string delphi delphi-xe5 firemonkey-fm3

4我必须将字符串写入二进制MIDI文件。该标准要求人们知道字符串的长度(以字节为单位)。因为我想为移动设备写作,所以我不能使用AnsiString,这是确保字符串是一个单字节字符串的好方法。这简化了事情。我测试了以下代码:

TByte = array of Byte;

function TForm3.convertSB (arg: string): TByte;
var
   i: Int32;
begin
   Label1.Text := (SizeOf (Char));
   for i := Low (arg) to High (arg) do
   begin
      label1.Text := label1.Text + ' ' + IntToStr (Ord (arg [i]));
   end;
end; // convert SB //

convertSB ('MThd');

它在Windows和Android中返回2 77 84 104 100(作为标签文本)。这是否意味着Delphi默认将字符串视为UTF-8?这将大大简化一些事情,但我无法在帮助中找到它。将此转换为字节数组的最佳方法是什么?读取每个字符并测试它是1,2或4字节并在数组中分配此空间?为了转换回字符:只需读取字节数组直到遇到一个字节< 128?

1 个答案:

答案 0 :(得分:35)

Delphi字符串在内部编码为UTF-16。 SizeOf(Char)为2的事实有一个很大的线索。

所有字符在ASCII范围内具有序数的原因是UTF-16扩展了ASCII,因为ASCII范围内的字符0到127在UTF-16中具有相同的序数值。并且所有字符都是ASCII字符。

也就是说,您不必担心内部存储。您只需使用TEncoding类在字符串和字节数组之间进行转换。例如,要转换为UTF-8,请编写:

bytes := TEncoding.UTF8.GetBytes(str);

反方向:

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

该类支持许多其他编码,如documentation中所述。从问题中不清楚您需要使用哪种编码。希望你能从这里完成剩下的工作。