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的倍数时,您只需要处理这种情况.
您可以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)上.
| 归档时间: |
|
| 查看次数: |
4704 次 |
| 最近记录: |