Проблема C ++: заполнение 8 битов в символ

Это странно Это тривиальная проблема:

Std :: string с битами, кратными длине 8, первые 8: «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));
}

Выходит:

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

Что не имеет смысла. Сдвиг 2 мест влево и получение 8 из 2 невозможно. Максимальное значение, которое оно может иметь, должно быть 111b = 7d, и в этом случае должно быть 100b = 4d.

Просвети меня.

0 c++
13.12.2008 17:42:14
1 ОТВЕТ
РЕШЕНИЕ
at k = 0, c = 1
at k = 1, c = 2
at k = 2, c = 8

Это потому:

input = 10011100
c = 0

`k=0, b=1` shift by 0 add 1 => `c = 1`, dec = 1
`k=1, b=0` shift by 1 add 0 => `c = 10`, dec = 2
`k=2, b=0` shift by 2 add 0 => `c = 1000`, dec = 8

b означает «текущий бит». Возможно, вы не хотите сдвигаться k, но мимо 1? Если вы ищете стандартное решение C ++, вы можете использовать std::bitset:

std::bitset<8> bits("10011100");
unsigned char c = bits.to_ulong();

Для вывода в поток вы можете использовать putфункцию:

outFile.put(c);

Это позволяет избежать указателей приведения, а также выводить в неотформатированном виде (такие параметры, как ширина поля игнорируются).

5
13.12.2008 19:20:16