【赫夫曼编码】实现文件中数据的加解密与压缩

该博客介绍了如何利用赫夫曼树和编码实现文件的加解密与压缩。通过构建赫夫曼树,根据字符频率生成编码表,对原始文件进行加密压缩,再解密还原文件,最后比较解码文件与原始文件的一致性。实验涉及文件操作、哈夫曼树结构、动态数组存储编码表等技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

(一)第一步就是思路整理

(二)函数模块

(三)主要数据类型与变量

1、定义哈夫曼树的结构

2、动态分配数组存储赫夫曼编码表

3、存储数据扫描统计结果

4、主要变量

(四)代码测试

1、方案

建三个文件

2、运行结果

压缩文件

解压文件

输出文件

比较文件

(五)源码部分


背景知识:二叉树的应用、赫夫曼树。

目的要求:掌握赫夫曼树和赫夫曼编码的基本思想和算法的程序实现。

实验内容:实现文件中数据的加解密与压缩:将硬盘上的一个文本文件进行加密,比较加密文件和原始文件的大小差别;对加密文件进行解密,比较原始文件和解码文件的内容是否一致。

实验说明:

1.输入和输出:

(1)输入:硬盘上给定的原始文件及文件路径。

(2)输出:

  • 硬盘上的加密文件及文件路径;
  • 硬盘上的解码文件及文件路径;
  • 原始文件和解码文件的比对结果。

2.实验要求:

  • 提取原始文件中的数据(包括中文、英文或其他字符),根据数据出现的频率为权重,构建Huffman编码表;
  • 根据Huffman编码表对原始文件进行加密,得到加密文件并保存到硬盘上;
  • 将加密文件进行解密,得到解码文件并保存点硬盘上;
  • 比对原始文件和解码文件的一致性,得出是否一致的结论。

3.参考类型定义   //双亲孩子表示法      

        typedef struct {

            unsigned int  weight;

            unsigned int  parent, lchild, rchild;

        } HTNode, *HuffmanTree;      //动态分配数组存储赫夫曼树

  • typedef char * * HuffmanCode;  //动态分配数组存储赫夫曼编码表

    (*≧︶≦))( ̄▽ ̄* )ゞ小唠叨

 

这是我们的数据结构实验二,作为拖延症患者的我ddl从来都是第一生产力,于是,熬了两个晚上终于把思路给理出来了。8过代码还是借鉴啦大佬的博客

https://blog.csdn.net/qq_43492703/article/details/99769317?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-4


 

(一)第一步就是思路整理

这个实验难在它对我来说有一些抽象,一开始对文件的压缩和解压的概念很模糊,后来找到了B站上的一个视频(https://www.bilibili.com/video/BV1Yt411Y76w?from=search&seid=11711631498115172127),把这个本来对我来说比较抽象的概念具体化了:假设文件中的内容是“abcdabccccca”12个字符,一个ascii码对应一个字节,那么就是12个字节。但是如果用少于1个字节的几个位来表示各个字符,列如a:10,c:11,b:01,c:00,那么算下来只需要不到12个字节(5-6个字节)就可以搞定。而每个字符的编码可以由哈夫曼编码得到,每个字符的权值就是它出现的频率。

实验中比较重要的两个步骤就是压缩和解压缩:

①压缩:先打开要压缩的文件,分析每个字符的总次数,然后将次数传给哈夫曼树,构建一颗哈夫曼树,然后获取到每个字符的哈夫曼编码,将编码写入文件

②解压缩:打开要解压缩的文件,读出储存的哈夫曼字典(结构体),然后根据字典逐个的翻译编码得到字符,写入文件。

哈夫曼编码的思路(来自上述链接中大佬的博客):

1、读取文件并存储到vector容器中

2、将vector容器中的数据按照以下TNode结构存储

typedef struct {/*存储数据扫描统计结果*/

    char* data;/*表示文件中的字符*/

    int* cou;/*同一个字符在文件中出现的次数*/

    int length;/*文件的字符总长度*/

}TNode;

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员朱帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值