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) 

彼らは、より大きなUTF8(可変ブロックサイズ)のために、ビットリーダーファイルBitreader (1327行目)で自作の関数を使用しています。

私はそれを調べましたが、C#に変換するのはそれほど良いコードではありません. そこで、UTF8 エンコーディングで binaryreader を使用して、このメソッドReadUint64で読み取ることを考えました。これが機能する可能性はありますか?それは同じ結果ですか、そして絶対に最速の解決策は何ですか?

4

1 に答える 1

0

いいえ、それはうまくいきません。ReadUInt64 は 8 バイトを読み取るだけです。エンコーディングは実際のテキストの読み取りにのみ使用されます-つまり、 ReadCharReadChars -タイプは 16 ビットのみであり、どちらも 36 ビット値を想定していないため、これらも機能しませんchar

ドキュメントに「UTF8 コード化」と書かれていても、それが真の UTF-8 であることを意味するわけではありません。文字をエンコードするために UTF-8 で使用されるのと同じ原理を使用して数値をエンコードすることを意味します (結局のところ、また、数値だけですが、より複雑な制限があります)。

ウィキペディアを見ると、UTF-8 文字がどのようにエンコードされているか (最大 31 ビット) が正確にリストされていることがわかります。36 ビット値に対してこのシーケンスを続けるのは非常に簡単です。その場合、最初のバイトは 2 進数で 11111110 になります。これが、サンプル番号に対して行うべきことです。

コードが素晴らしいとは思わないかもしれませんが、それが最も賢明な方法です。とにかく、UTF-8 の仕組みのために、ビット操作を避けることはできません。また、いくつかのバリエーションを作成することは確かに可能です。その正確なコードでは、基本的な構造が大きく異なる可能性は低いです。

于 2012-08-10T07:33:57.133 に答える