C++ 在C++;

C++ 在C++;,c++,huffman-code,C++,Huffman Code,假设我已经用压缩文件对哈夫曼树进行了编码。因此,我有一个示例文件输出: 001A1C01E01B1D 我在一点一点地将此字符串保存到文件时遇到问题。我知道C++只能一次输出一个字节,所以我有一个问题,它以字节的形式存储这个字符串。是否可以将前三位转换为字符,而不将程序填充为字节?如果它为遍历代码填充一个字节,那么我的树(和代码)将完全混乱。如果我一次把它切碎一个字节,那么如果树不是8的倍数,会发生什么呢?如果压缩文件的位长度不是8的倍数,会发生什么情况 希望我已经足够清楚了。简单地将一个n字节

假设我已经用压缩文件对哈夫曼树进行了编码。因此,我有一个示例文件输出:

001A1C01E01B1D
我在一点一点地将此字符串保存到文件时遇到问题。我知道C++只能一次输出一个字节,所以我有一个问题,它以字节的形式存储这个字符串。是否可以将前三位转换为字符,而不将程序填充为字节?如果它为遍历代码填充一个字节,那么我的树(和代码)将完全混乱。如果我一次把它切碎一个字节,那么如果树不是8的倍数,会发生什么呢?如果压缩文件的位长度不是8的倍数,会发生什么情况


希望我已经足够清楚了。

简单地将一个n字节的序列视为一个8n位的序列。使用
>
此问题的标准解决方案是填充。有许多可能的填充方案。填充方案最多可填充偶数个字节(即8位的倍数)。此外,它们对以位表示的消息长度或填充位的数量进行编码(从中可以通过减法确定以位表示的消息长度)。后一种解决方案显然会产生稍微更有效的填充效果

最简单的是,您可以将最后一个字节中“未使用”的位数附加为附加字节值

向上一级,首先假设填充位的数量适合3位。定义编码文件的最后3位以编码填充位的数量。现在,如果消息使用的最后一个字节不超过5位,那么填充可以很好地放在同一个字节中。如果需要添加一个字节来包含填充,则最大间隙为5+2=7(5来自额外字节中未使用的高位,2是最后一个字节中可能的最大可用空间,否则3位填充值将适合于此)。因为0-7可以用3位表示,所以这是可行的(2位不可行,因为最大间隙更大,可表示值的范围更小)


顺便说一下,将填充信息放在文件末尾(而不是作为文件开头的头)的主要优点之一是,压缩函数可以对流进行操作,而无需事先知道其长度。解压缩也可以基于流,并仔细处理EOF信号。

假设一个字符为8位,您希望第一个字符包含什么?下一个值的3位和5位?谢谢。最后,我在文件的开头添加了一个填充号,这样我就知道在哪里修剪流的结尾了。@TaylorBishop补充了关于在文件末尾放置填充信息的好处的解释。