文字配列をビットストリームとして扱うC / C ++コード
-
06-07-2019 - |
質問
char []配列にバイナリデータの大きな塊があり、パックされた6ビット値の配列として解釈する必要があります。
私は座り、これを行うためのコードを書くことができますが、誰かがすでに書いた優れた既存のクラスまたは関数がなければならないと考えています。
必要なのは次のようなものです:
int get_bits(char* data, unsigned bitOffset, unsigned numBits);
そのため、次の呼び出しでデータの7番目の6ビット文字を取得できます。
const unsigned BITSIZE = 6;
char ch = static_cast<char>(get_bits(data, 7 * BITSIZE, BITSIZE));
解決
これは、エンディアンシステムによっては、8より大きいサイズでは機能しない場合があります。基本的にはマルコが投稿したものですが、なぜ彼が一度に1つずつ収集するのかは完全にはわかりません。
int get_bits(char* data, unsigned int bitOffset, unsigned int numBits) {
numBits = pow(2,numBits) - 1; //this will only work up to 32 bits, of course
data += bitOffset/8;
bitOffset %= 8;
return (*((int*)data) >> bitOffset) & numBits; //little endian
//return (flip(data[0]) >> bitOffset) & numBits; //big endian
}
//flips from big to little or vice versa
int flip(int x) {
char temp, *t = (char*)&x;
temp = t[0];
t[0] = t[3];
t[3] = temp;
temp = t[1];
t[1] = t[2];
t[2] = temp;
return x;
}
他のヒント
Boost.DynamicBitset -試してください。
次の行の何かがうまくいくと思います。
int get_bit(char *data, unsigned bitoffset) // returns the n-th bit
{
int c = (int)(data[bitoffset >> 3]); // X>>3 is X/8
int bitmask = 1 << (bitoffset & 7); // X&7 is X%8
return ((c & bitmask)!=0) ? 1 : 0;
}
int get_bits(char* data, unsigned bitOffset, unsigned numBits)
{
int bits = 0;
for (int currentbit = bitOffset; currentbit < bitOffset + numBits; currentbit++)
{
bits = bits << 1;
bits = bits | get_bit(data, currentbit);
}
return bits;
}
デバッグもテストもしていませんが、開始点として使用できます。
また、ビットの順序を考慮してください。変更することもできます
int bitmask = 1 << (bitoffset & 7); // X&7 is X%8
to
int bitmask = 1 << (7 - (bitoffset & 7)); // X&7 is X%8
ビット配列の生成方法によって異なります。
所属していません StackOverflow