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

这篇具有很好参考价值的文章主要介绍了c++利用哈夫曼编码实现文件的压缩加密和解压缩解密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 需求分析

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

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

  1. 概要设计

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

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

  1. 详细设计

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

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

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

 

 

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

编码器实现压缩文件:

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

 

哈夫曼编码压缩,c++项目,c++,开发语言

 

压缩的流程:

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

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

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

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

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

 

解压缩流程:

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

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

 

项目效果演示:

主界面:

哈夫曼编码压缩,c++项目,c++,开发语言

功能1展示:

哈夫曼编码压缩,c++项目,c++,开发语言

 哈夫曼编码压缩,c++项目,c++,开发语言

 

功能2展示:

哈夫曼编码压缩,c++项目,c++,开发语言

功能3展示:文章来源地址https://www.toymoban.com/news/detail-773787.html

到了这里,关于c++利用哈夫曼编码实现文件的压缩加密和解压缩解密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 哈夫曼树编码的实现+图解(含全部代码)

    目录 哈夫曼树的基本概念 ------------哈夫曼树的构造方法  ------------------------哈夫曼编码 ------------------------------------全部代码           哈夫曼树 通常以二叉树的形式出现,所以也称最优二叉树,是一类带权路径长度最短的树 首先得知道下以下几个术语:         

    2024年02月03日
    浏览(74)
  • C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作

    本篇实验代码非本人写,代码源自外部,经调试解决了部分warning和error后在本地vs上可以正常运行,如有运行失败可换至vs 未来会重构实现该两个实验 内容要求: 1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立哈夫曼树 2、建立编码

    2024年02月13日
    浏览(58)
  • 【数据结构与算法】哈夫曼编码(最优二叉树)实现

    哈夫曼编码 等长编码:占的位置一样 变长编码(不等长编码):经常使用的编码比较短,不常用的比较短 最优:总长度最短 最优的要求:占用空间尽可能短,不占用多余空间,且不能有二义性 这里给出哈夫曼二叉树的实现: HuffmanTree.h: 测试数据(主函数): 运行结果截图

    2024年02月16日
    浏览(47)
  • 哈夫曼树与哈夫曼编码及等长编码

    哈夫曼树的构造:就是将给定的数据中选择最小的两个权值进行合并,然后重复该操作,构造出一个 二叉树。使其带权路径长度WPL最小的二叉树称为哈夫曼树或最优二叉树。 例如:给定几个数值:0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.01 可以将其扩大一百倍,以方便计

    2024年02月06日
    浏览(43)
  • 哈夫曼树、哈夫曼编码/解码

    哈夫曼树的基本介绍 哈夫曼树构建步骤图解 创建哈夫曼树代码实现 基本介绍 哈夫曼编码原理剖析 哈夫曼编码的实例 思路分析 代码实现 使用哈夫曼编码压缩文件的注意事项(代码胜省略)

    2024年02月08日
    浏览(41)
  • 15哈夫曼树/哈夫曼编码

    哈夫曼树又称为 最优树 ,作用是找到一种效率最高的判断树。 路径 :从树中一个结点到另一个结点之间的 分支 构成这两个结点之间的路径。 结点的路径长度 :两结点间路径上的分支树 如图 a :从 A - D 的路径长度就是是 2。从 A 到 B C D E F G F I 的路径长度分别为 1 1 2 2 3

    2024年02月05日
    浏览(44)
  • 【数据结构与算法】哈夫曼编码(最优二叉树实现

    哈夫曼编码 等长编码:占的位置一样 变长编码(不等长编码):经常使用的编码比较短,不常用的比较短 最优:总长度最短 最优的要求:占用空间尽可能短,不占用多余空间,且不能有二义性 这里给出哈夫曼二叉树的实现: HuffmanTree.h: 测试数据(主函数): 运行结果截图

    2024年02月16日
    浏览(45)
  • 哈夫曼树与哈夫曼编码

    哈夫曼树:结点中赋予一个某种意义的值,称为结点的权值,从根结点开始,到目标结点经过的边数,称为路径长度,路径长度乘以权值,称为带权路径长度; 例如:根结点代表着快递集散点,一个叶子结点权值是5,在业务逻辑中代表着重量是5斤的货物📦,路径长度是3,

    2024年02月05日
    浏览(49)
  • 哈夫曼树、哈夫曼编码和字典树

    目录 哈夫曼树 树的带权路径长度(wpl) 哈夫曼编码 代码实现哈夫曼树 封装哈夫曼树的节点 构建哈夫曼树 字典树 执行流程 代码实现字典树 封装字典树的节点 构建字典树         哈夫曼树(Huffman Tree)是一种带权路径长度最短的二叉树。哈夫曼树常常用于数据压缩,其压

    2023年04月09日
    浏览(50)
  • 哈夫曼树详解及其应用(哈夫曼编码)

    一,哈夫曼树的基本概念 路径: 从树中一个结点到另一个结点之间的 分支 构成这两个结点间的路径 结点的路径长度 :两结点之间路径上的 分支数 树的路径长度: 从 树根 到每一个结点的 路径长度之和 . 记作:TL 权(weight): 将树中结点赋给一个有着某种含义的数值

    2024年02月04日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包