将'bits'写入C++文件流

sor*_*h-r 11 c# c++ python java bit-manipulation

如何每次将"一位"写入文件流或文件结构?

是否可以写入队列然后刷新它?

是否可以使用C#或Java?

在尝试实现霍夫曼编码的实例时需要这样做.我无法将位写入文件,因此将它们写入位集然后(当压缩完成时)每次写入8位(排除最后一位).

dtb*_*dtb 13

缓冲各个位直到你累积了整个字节似乎是一个好主意:

byte b;
int s;

void WriteBit(bool x)
{
    b |= (x ? 1 : 0) << s;
    s++;

    if (s == 8)
    {
        WriteByte(b);
        b = 0;
        s = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

当要写入的位数不是8的倍数时,您只需要处理这种情况.


Emi*_*ier 8

您可以boost::dynamic_bitset一起使用std::ostream_iterator以简洁的方式获得所需的结果:

#include <fstream>
#include <iterator>
#include <boost/dynamic_bitset.hpp>

typedef boost::dynamic_bitset<unsigned char> Bitset;

// To help populate the bitset with literals */
Bitset& operator<<(Bitset& lhs, bool val) {lhs.push_back(val); return lhs;}

int main()
{
    Bitset bitset;
    bitset<<0<<1<<0<<1<<0<<1<<0<<1
          <<1<<0<<1<<0;

    std::ofstream os("data.dat", std::ios::binary);
    std::ostream_iterator<char> osit(os);
    boost::to_block_range(bitset, osit);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

dynamic_bitset通过指定unsigned char模板参数来制作8位的块大小.您可以通过指定更大的整数类型来使块大小更大.

boost::to_block_range将块中的bitset转储到给定的输出迭代器.如果最后一个块中有空的剩余位,则它们将用零填充.

当我在十六进制编辑器中打开data.dat时,我看到:AA 05.这是在一个小端平台(x64)上.