1

我正在编写一个需要处理任意二进制文件的霍夫曼压缩器和解压缩器(在 C++ 中)。我需要一些数据结构的建议。现在,我的压缩过程如下:

  • 以二进制形式将文件的字节读取到 char* 缓冲区
  • 使用 std::map 计算文件中每个字节模式的频率。(这就是我认为我在自找麻烦的地方。)
  • 根据频率直方图构建二叉树。每个内部节点都有其子节点的频率总和,每个叶节点都有一个 char* 来表示实际字节。

这就是我目前所处的位置。

我的问题是,如果我只使用从 char* 到 int 的映射,我到底在测量什么。如果我是正确的,这实际上不是我需要的。我认为我真正在做的是使用 char* 跟踪实际的 4 字节指针值。

所以,我打算做的是对直方图使用一个映射,对存储在叶节点的数据使用一个字符。我的逻辑在这里合理吗?我的推理告诉我是的,但由于这是我第一次处理二进制数据,我想小心那些只会以奇怪方式出现的陷阱。

谢谢。

4

1 回答 1

3

你不需要地图;只有 256 个可能的值。只需为输入中的每个字节int freq[256] = {0}添加并添加它。freq[data[idx]]++

如果您真的想要地图,请使用map<unsigned char, int>; 您对使用 map from 的怀疑char*是正确的。

于 2010-08-18T18:13:41.700 回答