Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何将字符串转换为字节数组并返回_String_Delphi_Delphi Xe5_Firemonkey Fm3 - Fatal编程技术网

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

String 如何将字符串转换为字节数组并返回,string,delphi,delphi-xe5,firemonkey-fm3,String,Delphi,Delphi Xe5,Firemonkey Fm3,4I必须将字符串写入二进制MIDI文件。标准要求知道字符串的长度(以字节为单位)。因为我也想为mobile编写,所以不能使用AnsiString,这是确保字符串为单字节字符串的好方法。这简化了事情。我测试了以下代码: TByte = array of Byte; function TForm3.convertSB (arg: string): TByte; var i: Int32; begin Label1.Text := (SizeOf (Char)); for i :=

4I必须将字符串写入二进制MIDI文件。标准要求知道字符串的长度(以字节为单位)。因为我也想为mobile编写,所以不能使用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中,它返回27784104 100(作为标签文本)。这是否意味着Delphi默认将字符串视为UTF-8?这将大大简化事情,但我在帮助中找不到它。将其转换为字节数组的最佳方式是什么?读取每个字符,测试它是1、2还是4字节,并在数组中分配此空间?对于转换回字符:只需读取字节数组,直到遇到一个字节<128?

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

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

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

bytes := TEncoding.UTF8.GetBytes(str);
相反的方向:

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

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

正是我想要的。谢谢我只想读写你已经猜到的UTF-8格式的文件。Tencodeding是一个很好的类,它解决了我的很多字符串格式问题。我的问题是因为担心我必须自己做所有的编码,因此产生了关于内部表示的问题。@Tlama-这是故意的:-)在编写MIDI文件时,我可以组织这种情况。我想知道Delphi在使用UTF-8字符时做了什么,它会自动将其更改为两个字节的表示形式吗?有趣的是,对于Windows和Android来说,情况并非如此。实际上,问题代码中的字符确实有两个字节宽。这是SizeOf的电话告诉你的。