4

異なるビット サイズ (8 ビット フィールド、次に 4 ビット フィールド、次に 9 ビット フィールド...) のデータを含むバッファがあります。

私はそれを読む必要があります。バイトレベルではなくビットレベルでポインターを使用して読み取ることができるライブラリがあれば、それは素晴らしいことです。

バッファを構造体にコピーすることはオプションではありません。調査した後、#pragma pack()または同様のものを使用する必要があり、移植性がないためです。

何か案が?

編集:私の問題の大きさを例で説明しようとします:

field1: 8 bits --> ok, get first byte
field2: 6 bits --> ok, second byte, and a mask
field3: 4 bits --> gets harder, i have to get 2 bytes, apply 2 different masks, and compose
field4 
... 
field 15: 9 bits ---> No idea of how to do it with a loop to avoid writing manually every single case

そして、私が考えることができる唯一の解決策は、構造体にコピーするpragma packことです。しかし、以前の質問で、移植性のために、それは良い解決策ではないと言われました。しかし、それが私を救うなら、私は喜んで別の意見を聞きます.

4

3 に答える 3

3

ビット操作を使用します。

unsigned char[64] byte_data;
size_t pos = 3; //any byte
int value = 0; 
int i = 0;
int bits_to_read = 9;
while (bits_to_read) {
    if (i > 8) {
      ++readPos;
      i = 0;
    }
    value |= byte_data[pos] & ( 255 >> (7-i) );
    ++i;
    --bits_to_read;
}
于 2012-10-24T14:08:06.727 に答える
0

Cには実際のビット単位のメソッドはありません(実際、これらをまだサポートしている組み込みプラットフォームに出くわすことさえ困難です)。

最善の策は、ビット演算を使用すること<< >> & and |です。

于 2012-10-24T14:09:02.150 に答える
0

ビットフィールドを使用して構造体を定義できます。

struct Data
{
unsigned field1:8;
unsigned field2:6;
unsigned field3:4;
// etc
};

このトリックは、構造体のすべてのビットフィールドの長さの合計が 8 の倍数である場合に機能します。

于 2012-10-24T14:16:28.273 に答える