我目前正在编写一个Flac-Decoder,所以我必须读取flac-header中编码的2个UTF8值。 这在文档中:
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)
他们在bitreader文件Bitreader(第1327行)中使用自制函数来获取更大的UTF8(变量块大小)。
我已经看了一下它并不是很好的代码转换成c#。所以我想到使用带有UTF8编码的二进制读取器并使用这种方法读取:ReadUint64。 这有可能吗?它是同样的结果,绝对最快的解决方案是什么?
答案 0 :(得分:0)
不,那不行。 ReadUInt64只读取8个字节;编码仅用于读取实际文本 - 即ReadChar和ReadChars - 那些也不起作用,因为char
类型只有16位,无论如何,这些都不会期望36位值。
当他们在你的文档中写“UTF8编码”时,这并不意味着它是真正的UTF-8 - 它只是意味着他们使用与UTF-8用来编码字符相同的原则编码数字(这是毕竟,也只是数字,但有更复杂的限制)。
如果查看Wikipedia,您会看到他们已经准确列出了UTF-8字符的编码方式,最多31位。对于36位值继续这个序列是非常简单的 - 在这种情况下,第一个字节是二进制的11111110 - 这就是你应该为样本数做的。
虽然您可能认为代码不是很好,但这是最合理的方法 - 无论如何,您都不会避免使用位操作,因为UTF-8的工作原理 - 尽管它当然可以对这些确切的代码做一些修改,基本结构不太可能有很大不同。