C++问题将8位填充到char中

sya*_*yaz 0 c++

这很奇怪.这是一个微不足道的问题:

一个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));
}
Run Code Online (Sandbox Code Playgroud)

产量输出:

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
Run Code Online (Sandbox Code Playgroud)

这没有意义.向左移动2个位置,从2个位置移动8个是不可能的.它可以具有的最大值应该是111b = 7d,在这种情况下应该是100b = 4d.

给我看.

Joh*_*itb 5

at k = 0, c = 1
at k = 1, c = 2
at k = 2, c = 8
Run Code Online (Sandbox Code Playgroud)

那是因为:

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
Run Code Online (Sandbox Code Playgroud)

b表示"当前位".可能你不想转移k,但通过1?如果您寻找标准C++解决方案,您可以使用std::bitset:

std::bitset<8> bits("10011100");
unsigned char c = bits.to_ulong();
Run Code Online (Sandbox Code Playgroud)

要将输出输出到流中,可以使用以下put函数:

outFile.put(c);
Run Code Online (Sandbox Code Playgroud)

它避免了转换指针并且还输出了未格式化的内容(忽略了字段宽度等设置).