簡単にするために、非同期/同期スキームは、mpeg ファイルで使用する場合にのみ意味があります。
4 バイトを読み込んで通常の整数に変換するのは簡単です。
// pseudo code
uint32_t size;
file.read( &size, sizeof(uint32_t) );
size = (size & 0x0000007F) |
( (size & 0x00007F00) >> 1 ) |
( (size & 0x007F0000) >> 2 ) |
( (size & 0x7F000000) >> 3 );
フレーム データと同じ非同期方式を使用している場合は、各バイトを個別に読み取り、FF00 パターンを探し、バイトごとに整数を再構築する必要があります。また、ヘッダーの「サイズ」フィールドが可変バイト数になる可能性がある場合、非同期バイトが挿入されるため、ヘッダー全体が可変バイト数になります。「ヘッダーのサイズは常に 10 バイトで、次のように見える... 」と言う方が簡単です。
ID3v2 ドキュメントによると、同期されていないデータのサイズは事前にわかりません。しかし、その発言には意味がありません。タグデータがバッファに格納されている場合、問題のある文字を $FF 00 に置き換えるだけで、非同期データのサイズを知ることができます。
あなたは正しいです、それは意味がありません。id3v2 ヘッダーとフレーム ヘッダーに記述されているサイズは、非同期が適用された場合のサイズです。ただし、id3v2 は mp3 以外のファイルのタグ付けに使用される可能性があるため、非同期/同期の概念が意味をなさないため、同期を解除せずにフレーム データを書き込むことができます。セクション6.2が言おうとしていたのは、「これがmp3ファイルであるか、フレームが非同期/同期で書き込まれているかに関係なく、フレームサイズは常にmpeg同期セーフな方法で書き込まれる」.
ID3v2.4 フレームでは、フレーム ヘッダーに「Data Length Indicator」フラグを設定できます。この場合、同期後にバッファの大きさを確認できます。仕様のセクション 4.1.2 を参照してください。
私を助けてくれる人はいますか?
適合する id3v2 タグ リーダーを作成した人からの役立つアドバイス: 仕様を理解しようとしないでください。それは確かに狂人とサディストによって書かれました。もう一度見るだけで悪夢にうなされます。