2

我目前正在编写一个 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 编码的 binaryreader 并使用这种方法读取:ReadUint64。这有可能吗?结果是否相同,绝对最快的解决方案是什么?

4

1 回答 1

0

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

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

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

虽然您可能认为代码不太好,但这几乎是最明智的做法 - 由于 UTF-8 的工作原理,无论如何您都不会避免位操作 - 虽然当然可以做出一些变化在那个确切的代码上,基本结构不太可能有很大不同。

于 2012-08-10T07:33:57.133 回答