HSN*_*HSN 5 c++ binary encoding huffman-code
我正在尝试用c ++实现Huffman的编码算法.
我的问题是:在我得到每个字符的等效二进制字符串后,如何将这些0和1作为二进制写入文件而不是字符串0或字符串1?
提前致谢 ...
您无法写入仅包含位的二进制文件;写入的数据的最小大小是一个字节(即 8 位)。
所以你应该做的是创建一个缓冲区(任何大小)。
char BitBuffer;
Run Code Online (Sandbox Code Playgroud)
写入缓冲区:
int Location;
bool Value;
if (Value)
BitBuffer |= (1 << Location);
else
BitBuffer &= ~(1 << Location)
Run Code Online (Sandbox Code Playgroud)
该代码(1 << Location)生成一个除 指定的位置外全为 0 的数字Location。然后,如果Value设置为 true,则将 Buffer 中的相应位设置为 1,否则设置为 0。使用的二进制操作相当简单,如果你不理解它们,任何好的 C++ 书籍/教程中都应该有。
位置应为 <0, sizeof(Buffer)-1> 范围内的数字,因此在本例中为 <0,7>。
使用 fstream 将缓冲区写入文件相对简单。只需记住将其作为二进制文件打开即可。
ofstream File;
File.open("file.txt", ios::out | ios::binary);
File.write(BitBuffer, sizeof(char))
Run Code Online (Sandbox Code Playgroud)
编辑:注意到一个错误并修复它。
EDIT2:你不能<<在二进制模式下使用运算符,我忘记了。
替代解决方案:使用std::vector<bool>或std::bitset作为缓冲区。
这应该更简单,但我想我可以帮助你更多一点。
void WriteData (std::vector<bool> const& data, std::ofstream& str)
{
char Buffer;
for (unsigned int i = 0; i < data.size(); ++i)
{
if (i % 8 == 0 && i != 0)
str.write(Buffer, 1);
else
// Paste buffer setting code here
// Location = i/8;
// Value = data[i];
}
// It might happen that data.size() % 8 != 0. You should fill the buffer
// with trailing zeros and write it individually.
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4043 次 |
| 最近记录: |