这很奇怪.这是一个微不足道的问题:
一个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.
给我看.
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)
它避免了转换指针并且还输出了未格式化的内容(忽略了字段宽度等设置).
| 归档时间: |
|
| 查看次数: |
1010 次 |
| 最近记录: |