This is weird. It is a trivial problem:
A std::string with bits with length multiple of 8, the first 8 is: ‘10011100’.
//Convert each 8 bits of encoded string to bytes unsigned char c = 0; for(size_t i = 0; i < encoded.size(); i += 8) { for(size_t k = 0; k < 8; k++) { c <<= k; if(encoded.at(i + k) == '1') c += 1; //Debug for first 8 bits if(i == 0) cout << 'at k = ' << k << ', c = ' << (int)c << endl; } outFile.write(reinterpret_cast<char*>(&c), sizeof(char)); }
Yields the output:
at k = 0, c = 1 at k = 1, c = 2 at k = 2, c = 8 at k = 3, c = 65 at k = 4, c = 17 at k = 5, c = 33 at k = 6, c = 64 at k = 7, c = 0
Which doesn’t make sense. Shifting 2 places left and getting 8 from 2 is impossible. The max value it can have should be 111b = 7d and in this case should be 100b = 4d.
Enlight me.
That is because:
b means ‘current bit’. Possibly you don’t want to shift by
k, but by1? If you look for a standard C++ solution, you can usestd::bitset:For your output into the stream, you can use the
putfunction:It avoids casting pointers and also outputs unformatted (settings like the field-width are ignored).