Code C / C ++ pour traiter un tableau de caractères comme un stream binary

J’ai un gros bloc de données binarys dans un tableau char [] que je dois interpréter comme un tableau de valeurs 6 bits compressées.

Je pourrais m’asseoir et écrire du code pour faire cela, mais je pense qu’il doit y avoir une bonne classe ou fonction existante, quelqu’un a déjà écrit.

Ce dont j’ai besoin, c’est quelque chose comme:

int get_bits(char* data, unsigned bitOffset, unsigned numBits); 

afin que je puisse obtenir le 7ème caractère 6 bits dans les données en appelant:

 const unsigned BITSIZE = 6; char ch = static_cast(get_bits(data, 7 * BITSIZE, BITSIZE)); 

Cela peut ne pas fonctionner pour des tailles supérieures à 8, selon le système Endian. C’est fondamentalement ce que Marco a posté, bien que je ne sois pas tout à fait pourquoi il rassemblerait un morceau à la fois.

 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 – essayez-le.

Je pense que quelque chose dans la ligne de ce qui suit pourrait fonctionner.

 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; } 

Je ne l'ai ni débogué ni testé, mais vous pouvez l'utiliser comme sharepoint départ.

Tenez également compte de l'ordre des bits. Vous voudrez peut-être changer

  int bitmask = 1 << (bitoffset & 7); // X&7 is X%8 

à

  int bitmask = 1 << (7 - (bitoffset & 7)); // X&7 is X%8 

en fonction de la façon dont le tableau de bits a été généré.