c++利用哈夫曼编码实现文件的压缩加密和解压缩解密

本文详细介绍了如何使用C++实现哈夫曼编码,构建哈夫曼树,并以此实现文件的压缩和解压缩。在压缩过程中,统计字符频率,构建哈夫曼树,用编码替换字符实现压缩;在解压缩时,重构哈夫曼树,遍历压缩文件还原原始内容。项目展示了压缩加密前后效果以及功能演示。
摘要由CSDN通过智能技术生成
  1. 需求分析

@1:编码实现哈夫曼树,然后根据数据建立哈夫曼树,然后显示所有的字符的哈夫曼编码

@2:实现哈夫曼编码和解码 并通过编码实现文本文件的压缩 通过解码实现压缩文件的解压缩

  1. 概要设计

@1:在二叉树的基础上实现哈夫曼树的数据结构

@2:读取文本文件-->对字符频度进行统计-->构建哈夫曼树-->进行哈夫曼编码-->通过哈夫曼编码将文本文件压缩输出到压缩文件中

  1. 详细设计

@1:哈夫曼树的实现以及哈夫曼编码:

哈夫曼树的是是实现思路:

给定一个字符集合,统计字符出现的频率,并按照频率从小到大排序。取出频率最小的两个字符,将它们作为叶子节点构建一棵二叉树(可以使用任意一种二叉树表示方式,比如孩子兄弟表示法)。以该二叉树为基础,再次取出频率最小的两个字符,将它们添加到这棵二叉树中(作为兄弟或者作为父节点的左右孩子),得到一棵较大的二叉树。重复上述步骤,直到所有字符都被添加到二叉树中。此时,生成的二叉树即为哈夫曼树。根据哈夫曼树的构建规则,左子树代表频率较小的字符,右子树代表频率较大的字符。对于每一个叶子节点,记录其路径所代表的二进制编码即为该字符的哈夫曼编码。

 

 

@2:哈夫曼编码器和解码器是实现文本文件的压缩和解压缩

编码器实现压缩文件:

压缩原理:字符频度越大的字符的哈夫曼编码越短 那么就可以用哈夫曼编码来替换原字符的编码 从而实现解压缩,大致如下图:

 

8b2dd168e0f5482fab863dc3d272e10c.png

 

压缩的流程:

首先一个字符一个字符的读取待压缩文件 统计字符的种数以及字符出现的频度

为了解压缩时重构哈夫曼树 所以此时要将字符的出现的字符种数,字符以及相应的频度写入待压缩文件 然后紧接着写入压缩文件的长度

然后根据字符以及字符频度创建哈夫曼树 进行哈夫曼编码

然后以二进制的方式一个一个字节地遍历待压缩文件 准备一个中间空字符tempchar和计数器num 匹配每个字节对应的哈夫曼编码

然后通过遍历哈弗编码进行位操作每遍历一位哈夫曼编码就将tempchar左移一位 num自增1 如果当前哈夫曼编码是1就将tempchar|1 ,当num=8的时候将tempchar写入压缩文件 ,然后将tempchar 和num复原继续遍历哈夫曼编码,直到遍历完待压缩文件,如果最后的哈夫曼编码不足8位那么就在后面补0 补齐8位

 

解压缩流程:

首先从压缩文件种读取字符以及字符频度重构哈弗曼树 然后读取文件长度并记录

然后一个字节一个字节地遍历压缩文件之后的字符  ,从根节点出发,并且对每个字节的每一位通过位运算遍历 如果是1 移动到有孩子 如果是0就移动到左孩子 只要判断移动到了叶子结点 就将叶子节点对应的字符写入到解压缩之后的文件中,

 

项目效果演示:

主界面:

614b1675bc9b464489cf8ea7cafca776.png

功能1展示:

0b315c02687143e19984c35388c04cb1.png

 85bb42842c664615a50ede229e4aa783.png

 

功能2展示:

ad2f01d7dc794b95b50f6c3a46f58877.png

功能3展示

  • 9
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

pp不会算法^v^

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

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

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

打赏作者

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

抵扣说明:

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

余额充值