0

我正在为霍夫曼编码做一些作业。我已经完成了 Huffman 算法,但需要稍微改变它以处理二进制文件。我花了一些时间阅读相关问题,也许由于我对数据类型和二进制文件缺乏了解,我仍然有点挣扎,所以希望我不会重复之前的问题(我不会发布相关的代码到程序的霍夫曼部分)。

这是关键短语:“您可以假设将映射到代码字的每个符号都是一个 4 字节的二进制字符串。”,我想我知道的是 Char 代表一个字节,而 unsigned int 代表四个字节,所以我猜我应该一次将输入的四个字节读入一个无符号整数缓冲区,然后为程序的霍夫曼部分收集我的数据。

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 存储在结构中。只是出于好奇,我将如何将缓冲区重新转换为字符串?
编辑:存储霍夫曼压缩文件的标题的最佳方法是什么?

4

1 回答 1

1

这看起来像是处理数据的好方法吗?

我建议不要使用指针,而是使用unionandint并将char [4]指针传递给char你应该的数组。不知道其余的逻辑是什么,所以不能说实际处理(不在您发布的代码中)是否以一种好的方式完成,但在我看来这似乎相当微不足道。

如果只剩下 1,2 或 3 个字节,我应该如何处理文件的最后?

假设每个符号长 4 个字节,我希望这不是一个有效的输入。

因此,我只是将缓冲区作为 unsigned int 存储在结构中。只是出于好奇,我将如何将缓冲区重新转换为字符串?

为什么要这么做?在您的数据中,一个“字符”是 4 个字节。但是,如果需要,您可以只使用转换为字节数组(或者,如果顺序很重要,更好的是使用按位运算来提取实际字节)。

于 2011-05-29T07:14:56.690 回答