n ビットをバイナリ ファイルとの間で読み書きしたいと考えています。たとえば、次の n ビットを整数に、または次の n ビットを char に読み取ります。データをバイト アラインではなく、ビット アラインにする必要があります。
それを可能にする C++ ライブラリはありますか?
ostream/istream を使用する場合、バイト アライン データの使用に制限されているようです。データをぎっしり詰め込みたい場合、これでは十分ではありません。
n ビットをバイナリ ファイルとの間で読み書きしたいと考えています。たとえば、次の n ビットを整数に、または次の n ビットを char に読み取ります。データをバイト アラインではなく、ビット アラインにする必要があります。
それを可能にする C++ ライブラリはありますか?
ostream/istream を使用する場合、バイト アライン データの使用に制限されているようです。データをぎっしり詰め込みたい場合、これでは十分ではありません。
もちろん、自分でビットレベルのアクセスを行う場合は、バイト整列アクセスで「十分」です。:)
これは、あなたが望むもののように聞こえる「ビットファイル」ライブラリです。私はこれを自分でテストしていませんが、かなり最小限に聞こえます.
以下の手順を使用して、バイナリ ファイルからビットを読み取ることができます。
mmap を使用して、メモリ内のバイナリ データ ファイルをマップします。ファイル サイズがバイトの倍数でない場合は、マップされたメモリ領域の最後にパディング ビットがあります。パディング ビットの数は、1 から 7 の間の任意の数です。
これで、ビットマスクを使用してメモリ マップ領域から必要なビットを読み取ることができます。ビット単位の AND 演算を使用する必要があることに注意してください。ビットマスクの値は、リトル エンディアンとビッグ エンディアンのプラットフォームによって異なります。そのため、コードは移植性がなく、移植性について特別な注意が必要です。
さらに、ビット単位の右または左回転演算子も使用する必要がある場合があります。
マップされたメモリ領域の一部を、ビット フィールドを持つ C++ データ構造として型キャストすることもできます。ここで、バイト アラインメントのために C++ 構造体でパディングを使用しないようにコンパイラに指示する必要があります。これは、「#PRAGMA PACK(1)」ディレクティブを使用して実現できます。繰り返しになりますが、ビット フィールドを含む C++ 構造体は、リトル エンディアンおよびビッグ エンディアンのプラットフォーム間で移植できません。
上記の方法の小さなバリエーションを使用して、ビットをバイナリ ファイルに書き込むことができます。