C#读取UTF8 UInt64

C#读取UTF8 UInt64,c#,utf-8,binaryreader,C#,Utf 8,Binaryreader,我目前正在编写一个Flac解码器,因此我必须读取Flac头中编码的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) if(可变块大小) :“UTF-8”编码样本编号(解码编

我目前正在编写一个Flac解码器,因此我必须读取Flac头中编码的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) 
if(可变块大小)
:“UTF-8”编码样本编号(解码编号为36位)
其他的
:“UTF-8”编码帧编号(解码编号为31位)
他们在比特读取器文件(第1327行)中使用一个自制函数来实现更大的UTF8(可变块大小)

我已经看过了,它并不是很好的代码翻译成c。因此,我考虑使用UTF8编码的二进制读取器,并使用以下方法进行读取:。
这有可能奏效吗?这是相同的结果吗?什么是绝对最快的解决方案?

不,这不起作用。ReadUInt64将只读取8个字节;编码仅用于读取实际文本,即and,这些也不起作用,因为
char
类型仅为16位,并且这两种类型都不需要36位的值

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

如果你看一下,你会发现他们精确地列出了UTF-8字符的编码方式,最多31位。对于一个36位的值,继续这个序列是非常简单的——在这种情况下,第一个字节将是11111110二进制的——这就是您应该对样本数执行的操作


虽然您可能认为代码不好,但这是最明智的做法——无论如何,由于UTF-8的工作方式,您都不会避免位操作——虽然确实可以对该代码进行一些修改,但基本结构不太可能有很大不同。

不,这不起作用。ReadUInt64将只读取8个字节;编码仅用于读取实际文本,即and,这些也不起作用,因为
char
类型仅为16位,并且这两种类型都不需要36位的值

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

如果你看一下,你会发现他们精确地列出了UTF-8字符的编码方式,最多31位。对于一个36位的值,继续这个序列是非常简单的——在这种情况下,第一个字节将是11111110二进制的——这就是您应该对样本数执行的操作

虽然您可能认为代码不好,但这几乎是最明智的方法——无论如何,您都不会避免位操纵,因为UTF-8是如何工作的——虽然确实可以对确切的代码进行一些修改,但基本结构不太可能有很大的不同