2015年10月10日土曜日

複数バイトにまたがるビット演算

ADTS形式のAACファイルのヘッダ解析等において、複数バイトにまたがるビット列を解析したい場合があります。
今回はそのような場合におけるビット列の読み込み・書き込みの例題を示します。

bitbuffer.h/bitbuffer.cpp がビット演算を行うヘッダ及びソース。

sample.cpp にて ADTS形式のヘッダを生成するための例を用意しています(AAC LC 形式のヘッダ)。
また、生成した ADTS形式のヘッダの内容を解析して構造体に読み込み直すための例(ParseAdtsHeader 関数)も用意しています。
適当なADTS形式のAACファイルの解析を行う場合には、syncword 等により ADTSヘッダの先頭位置を検索し、ParseAdtsHeader 関数によりヘッダを読みこめば AACファイル内のチャンネル数やサンプリングレート等の情報を読み込むことができます。

bitbuffer.cpp では、InitiBitBuffer により解析に用いるバッファや長さを指定し、その中のビットを徐々にシフトしながら読み込み・書き込みを行っています。
指定された長さ以上の読み込みや書き込みを行おうとした際には、何も起きずにエラーが返ります。

sample.cpp bitbuffer.h bitbuffer.cpp 実行結果