使用哈夫曼编码实现txt文本的压缩(目前只支持英文文本)

这是我第一尝试发帖子,有不足指出希望大家不吝指出和理解。

文本压缩效率

亲自测试,文本压缩效率大概在60%左右,是下载的英文版双城记。大概是198k可以压缩成121k左右的样子,当然压缩效率并不是绝对的,相对于不同内容的文本压缩效率会有所不同。重复性较高的文本压缩效率会更高。

功能

这个代码实现了两个功能:
1)一个是手动输入字符串进行数据分析,然后输出字符串压缩后的二进制编码和字符串内每种类型字符的霍夫曼编码。然后可以输入二进制编码的字符串(手动输入101010这种编码,2或者其他字符会跳出报错),可以进行数据解码。

2)选择文件进行数据的压缩,代码上选择某个文本源文件,然后再选择一个输出的目标文件,将源文件的数据压缩后存储再目标文件中。并将目标文件的数据读取、解压后放在目标文件二中。

代码实现

1)手动输入编码解码

1.获取手动输入的字符串,并分析
2.根据分析后的字符串数据,建立哈夫曼树
3.输出哈夫曼树内的编码信息
4.输出字符串的编码
5.获取哈夫曼树的根节点(后面解码二进制编码用)
6.输入二进制字符串,并解码
7.释放树

GetString(&StringData);					     //获取输入的字符串
 BuildHuffmanTree(&StringData,&HuffmanHead); //建立哈夫曼树
 GetHuffmanCode(StringData,&HuffmanHead);
 OutPutTreeCode(StringData,HuffmanHead);
 OutPutStringCode(StringData);
 GetHufmanRootNode(HuffmanHead);
 AnalyseTreeCode(RootTreeNode);
 FreeTreeCode(HuffmanHead.NextNode);

效果在这里插入图片描述

2)获取文件进行压缩

先打开需要的三个文件,一个源文件、目标文件1,目标文件二
1.读取源文件数据,读取出源文件所有字符,分析字符和权值
2.根据字符串信息,建立哈夫曼树
3.获取哈夫曼编码
3.输出每个类型字符的编码
4.获取哈夫曼树的根节点(后面解码二进制编码用)
5.开始数据压缩,将源文件数据压缩到目标文件1内
6.开始解压,将目标文件1中的数据,解压到目标文件2内

 OpenFile(fp1,&StringData);
 BuildHuffmanTree(&StringData,&HuffmanHead); //建立哈夫曼树
 GetHuffmanCode(StringData,&HuffmanHead);
 OutPutTreeCode(StringData,HuffmanHead);
 GetHufmanRootNode(HuffmanHead);
 StartCompression(fp1,fp2,StringData,&FileBitQueue);
 StartDecompression(fp2,fp3,RootTreeNode);
 FreeTreeCode(HuffmanHead.NextNode);

文件编码的效果
在这里插入图片描述

遇到的问题和不足

由于压缩后的目标文件1,内的数据不是正常的文本数据,打开是乱码,因此在写入数据到目标文件1和从目标文件1中读取数据都不能使用正常的txt文本读写。
首先打开该文本时,应该使用“wb”方式打开,防止使用“wt”时写入数据和读取数据会出错。
其次源文件不能出现乱码,这个乱码会导致在压缩过程中字符串读取出错。

有兴趣可以参考代码:
链接:https://pan.baidu.com/s/1naEM-HyLp1whdDIW4bavLA
提取码:qj4s

  • 10
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值