200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 使用哈夫曼编码实现txt文本的压缩(目前只支持英文文本)

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

时间:2023-04-06 03:51:25

相关推荐

使用哈夫曼编码实现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”时写入数据和读取数据会出错。

其次源文件不能出现乱码,这个乱码会导致在压缩过程中字符串读取出错。

有兴趣可以参考代码:

链接:/s/1naEM-HyLp1whdDIW4bavLA

提取码:qj4s

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。