- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我已经用压缩文件编码了我的霍夫曼树。所以我有一个示例文件输出:
001A1C01E01B1D
我在将此字符串逐位保存到文件时遇到问题。我知道 C++ 一次只能输出一个字节到文件,所以我在以字节为单位存储这个字符串时遇到了问题。是否可以将前三位转换为 char 而无需程序填充为字节?如果它为遍历代码填充一个字节,那么我的树(和代码)将完全困惑。如果我一次将其切一个字节,那么如果树不正好是 8 的倍数会怎样?如果压缩文件的位长不是 8 的倍数会怎样?
希望我已经说得够清楚了。
最佳答案
这个问题的标准解决方案是填充。有许多可能的填充方案。填充方案最多填充偶数个字节(即 8 位的倍数)。此外,它们对消息的长度(以位为单位)或填充位的数量进行编码(可以通过减法从中确定以位为单位的消息长度)。后一种解决方案显然会导致填充效率稍微高一些。
最简单的是,您可以在最后一个字节中附加“未使用”的位数作为附加字节值。
更上一层楼,首先假设填充位数为 3 位。定义编码文件的最后 3 位以对填充位数进行编码。现在,如果消息使用的最后一个字节不超过 5 位,则填充可以很好地适契约(Contract)一字节。如果需要添加一个字节来包含填充,则最大间隙为 5+2=7(5 来自额外字节未使用的高位,2 是最后一个字节中可用的最大可能空间,否则 3 -位填充值会适合那里)。由于 0-7 可以用 3 位来表示,所以这是可行的(它不适用于 2 位,因为最大间隙更大并且可表示值的范围更小)。
顺便说一下,将填充信息放在文件末尾(而不是作为文件开头的 header )的主要优点之一是压缩函数可以在流上运行,而无需提前知道它的长度。解压缩也可以基于流,小心处理 EOF 信号。
关于c++ - 在 C++ 中紧凑地保存霍夫曼树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29396435/
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我这样定义了一个二叉树: struct btree { int x; btree* left_child = nullptr; btree* right_child = nul
我有这个霍夫曼代码,旨在返回数组中每个字母的霍夫曼代码并按字母顺序打印它们。问题是它不生成任何输出,而是继续处理,直到我手动退出它。谁能帮我找出错误吗?我认为我的代码是正确的,但我不知道无限循环从何而
动机 想象一下一个哈夫曼压缩文件被部分下载,就像在p2p软件中一样,所以我们首先为整个文件分配磁盘空间,然后开始随机下载文件块。其中一个哈夫曼密码(但我们不知道是哪一个)是一个结束密码,所以如果这个密
以下 block 由霍夫曼 block 标记嵌套 -HUFF---------------------------------------------------------------------0
我是一名优秀的程序员,十分优秀!