2014-01-29 142 views
8

4I必须将字符串写入二进制MIDI文件。该标准要求用户知道字节的长度。由于我想写手机以及我不能使用AnsiString,这是确保字符串是一个字节的字符串的好方法。这简化了事情。在Windows以及Android的如何将字符串转换为字节数组并返回

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'); 

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

+1

@Tlama - 这是故意的:-)当编写一个MIDI文件时,我可以组织这种情况。我想知道Delphi在使用UTF-8字符时做了什么,它会自动将它改为两个字节的表示吗?它并没有和有趣的一样 - 它对Windows和Android一贯如此。 – Arnold

+0

实际上,你在代码中的字符确实是两个字节宽。这就是SizeOf告诉你的。 –

回答

30

Delphi字符串在内部编码为UTF-16。 SizeOf(Char)是2.

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

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

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

而在相反的方向:

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

类支持许多其他的编码,如documentation描述。这个问题并不清楚你需要使用哪种编码。希望你能从这里开始工作。

+0

正是我所期待的。谢谢! – Arnold

+1

我想单独使用UTF-8来读取和写入文件,而您已经猜到了。 TEncoding是一个很好的课程,它解决了我的很多字符串格式问题。我的问题受到我自己不得不自己编码的恐惧的启发,因此也就是关于内部表示的问题。 – Arnold

相关问题