Huffman编码与解码(实现任意文章内容压缩)

哈夫曼编码实战
本文详细介绍了一篇英文文章通过哈夫曼编码进行压缩与解压缩的过程。包括统计字符频率、构建哈夫曼树、生成编码规则,并实现了文件的编码与解码。

[问题描述]

对一篇不少于5000字符的英文文章(Huffman编码材料.txt),统计各字符出现的次数,实现Huffman编码(code.dat),以及对编码结果的解码(recode.txt)。

[基本要求]

(1) 输出每个字符出现的次数和编码,并存储文件(Huffman.txt)。

(2) 在Huffman编码后,英文文章编码结果保存到文件中(code.dat),编码结果必须是二进制形式,即0 1的信息用比特位表示,不能用字符‘0’和‘1’表示(*)。

(3) 实现解码功能。

原文章:

对于这道题,首先应该求出每个字符出现的次数,作为哈夫曼编码的权重,这里我们只需打开文件,读取文件中的数据,再统计字符个数即可。之后我们开始建立哈夫曼树(这里我就不多说了,不知道如何建哈夫曼树的可以看我之前的文章,有详细解说),哈夫曼树建立完成后,我们即可求得每个字符的编码方式。

到这里,如果之前写过哈夫曼树的建立,做起来就比较容易,但我们也只完成了第一个问题,比较麻烦的是后面两问。第二问实质就是让我们对文章内容进行压缩,并保存到一个二进制文件中;第三问是让我们根据压缩得到的二进制文件还原文章。

压缩:现在,我们只是知道了每一个字符的编码方式,那么如何根据编码方式对文章内容进行压缩呢?这里我采用了一个比较暴力的方法。先将原来所有字符的哈夫曼编码连成一个长字符串(均为0、1),然后每8位取一组(注:一个字符是8个bit,所以每8位取一个),组成一个无符号类型的字符(unsigned char),这里要重点处理的一个问题是,最后不足8位的,我们要在后面补0来凑成8位,然后多读取一个提示符,提示最后一个凑成的字符原来的位数(因为在解码时,后面补的0是多余的,我们要根据提示符来把这些0舍去)。

解码:我们把字符依次从二进制文件中读出来,再把它们转回二进制的0、1形式,具体做法就是除2取余,最后不足8位的补0,再逆序,这样就可以还原原来的哈夫曼编码。当读到倒数第二个字符时(因为最后一个是我们多加的提示符,所以倒数第二个字符即为原来的最后一个字符),先把它转成8位0、1字符串,接着把提示符读出来,根据提示符的大小来截断8位字符串。到此我们就可以得到原来所有字符的哈夫曼编码连成的长字符串。再根据哈夫曼编码的方式对其进行解码即可。

注:编码和解码应该是分开进行的,解码的时候知道的只有编译后的二进制文件和解码方式。不应从之前编码的操作中直接获取提示(例如直接就知道最后一个8位字符串应该保留几位)。

源代码:


                
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值