2012-08-10 70 views
1

我正在写一个Flac解码器,所以我必须读取flac-header中编码的2个UTF8值。 这是在文档中:C#读取UTF8 UInt64

if(variable blocksize) 
    <8-56>:"UTF-8" coded sample number (decoded number is 36 bits) 
else 
    <8-48>:"UTF-8" coded frame number (decoded number is 31 bits) 

他们在更大的UTF8(可变块大小)的bitreader文件Bitreader(行1327)用自制的功能。

我看了一下,它不是非常好的代码来转换成C#。所以我想过使用带有UTF8编码的binaryreader并用这种方法读取:ReadUint64。 这可能是有效的吗?这是否是相同的结果?什么是绝对最快的解决方案?

回答

0

不,这是行不通的。 ReadUInt64只会读取8个字节;编码仅用于读取实际文本 - 即ReadCharReadChars - 而那些将不起作用,因为char类型只有16位,并且无论如何都不会期望36位值。

当他们在文档中编写“UTF8编码”时,这并不意味着它是真正的UTF-8 - 它只是表示它们使用与UTF-8使用的相同原则编码一个数字(它们是毕竟,也只是数字,但具有更复杂的限制)。

如果你看看Wikipedia,你会看到他们已经精确地列出了UTF-8字符的编码方式,最多31位。对于一个36位值继续这个序列非常简单 - 在这种情况下,第一个字节将是11111110二进制 - 这就是你应该为样本数量做的事情。

虽然你可能不认为代码是好的,但它是最明智的方法 - 无论如何,由于UTF-8的工作方式,你不会避免位操作 - 尽管它当然可行为了对这个确切的代码做一些变化,基本结构不太可能有很大的不同。