如何使用Huffman代码压缩文件?

时间:2011-07-04 22:20:57

标签: c++ huffman-code

我的程序将霍夫曼代码存储在char[8]变量中。我想将它存储在unsigned char变量中。我这样做,但不认为它正常工作,因为当我使用以下代码提取我的文件时,它不起作用:

unsigned char bit2byte ( unsigned char bits[8] ) {
    unsigned char x = 0; 

    for ( int k = 0; k < 8; k++ ) {
        if ( bits[k] == '1' ) 
            x = x | 1;

        x <<= 1; 
    }

    return x; 
}

3 个答案:

答案 0 :(得分:3)

这一行怎么样:

if ( bits[k] == '1' ) 

bits数组是否将您的位存储为ASCII字符或数字值,即如果您尝试将会发生什么

if ( bits[k] == 0x01 )

你可能会因为无法读懂你的想法而向我投降......

答案 1 :(得分:0)

Huffman是一种压缩方案,如果你想读取一个霍夫曼编码文件,你最想解码它(即解压缩它)

http://en.wikipedia.org/wiki/Huffman_coding

在霍夫曼编码数据中,每个字符都表示为可变数量的位,因此您无法通过简单地传入文件的固定部分来处理文件,期望在每次调用中返回单个字节 - 您必须保持每次调用消耗多少位的状态,以及在比特流中开始处理以提取下一个字节的位置。

要正确解码霍夫曼数据,您需要编码树(请参阅维基百科链接) - 此树很可能也存储在文件中 - 所以您的文件实际上很可能有两部分:(1)编码/解码树,以及(2)数据 - 如何存储在文件中是特定于实现的,因此在尝试解码任何内容之前,您需要先了解规范。

希望这有帮助。

答案 2 :(得分:-1)

我不清楚你的意思是“不起作用”,但可能你需要走另一条路。

for (int k = 7; k >= 0; k--) {

以及其他所有事情。

当然,我也不知道为什么你用8个字节只存储8位信息。