我正在为霍夫曼编码做一些功课。我已经完成了霍夫曼算法,但需要稍微修改它以使用二进制文件。我花了一些时间阅读相关问题,也许是由于我对数据类型和二进制文件缺乏了解,我仍然有点挣扎,所以希望我不会重复先前的问题(我不会发布相关的代码)到程序的霍夫曼部分)。
这是关键短语:“你可以假设每个符号,它将映射到一个代码字,是一个4字节的二进制字符串。”,我想我知道的是Char代表一个字节和unsigned int代表四个字节,所以我猜我应该一次读取输入四个字节到unsigned int Buffer然后收集我的数据用于程序的Huffman部分。
int main() {
unsigned int buffer;
fstream input;
input.open("test.txt", ios::in | ios::binary);
while(input) {
input.read(reinterpret_cast<char *>(&buffer), 4);
//if buffer does not exist as unique symbol in collection of data add it
//if buffer exists update statistics of symbol
}
input.close();
}
这看起来像处理数据的好方法吗?如果只剩下1,2或3个字节,我该如何处理文件的最后?那么我只是将缓冲区存储为结构中的unsigned int。出于好奇,我如何将缓冲区重新加入一串字符? 编辑:存储霍夫曼压缩文件头的最佳方法是什么?
答案 0 :(得分:1)
这看起来是处理数据的好方法吗?
我建议使用union
int
和char [4]
并将指针传递给char
数组,而不是指针。不知道剩下的逻辑是什么,所以不能说实际处理(你发布的代码中没有)是以一种好的方式完成的,但在我看来相当简单。
如果只剩下1,2或3个字节,我该如何处理文件的最后?
假设每个符号长4个字节,我希望它不是有效的输入。
那么我只是将缓冲区存储为struct中的unsigned int。出于好奇,我如何将缓冲区重新设置为一串字符?
你为什么这样做?在您的数据中,“字符”是4个字节。但是你可以根据需要使用转换为字节数组(或者,更好的是,如果顺序很重要,则使用按位运算来提取实际字节)。