C / C ++ code for treating an array of characters as a bitstream

I have a large chunk of binary data in a char [] array, which I need to interpret as an array of packed 6-bit values.

I could sit down and write some code to do this, but I think there must be a good existing class or function that someone has already written.

I need something like:

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

so that I can get the 7th 6-bit character in the data by calling:

 const unsigned BITSIZE = 6; char ch = static_cast<char>(get_bits(data, 7 * BITSIZE, BITSIZE)); 
+7
c ++ bit-manipulation extract
source share
3 answers

This may not work for sizes larger than 8, depending on the system. This is basically what Marco wrote, although I'm not quite sure why he collected one bit at a time.

 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; } 
+4
source share
+7
source share

I think something in the next line might work.

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

I have not debugged or tested it, but you can use it as a starting point.

Also consider the order of the bits. You might want to change

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

to

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

depending on how the bitmap was created.

+1
source share

All Articles