软件压缩/解压缩软件Szip(Huffman算法及应用)

完整代码下载地址

1.需求规格说明

【问题描述】

利用哈夫曼树编码进行对已有文件进行重新编码可以大大提高减小文件大小,减少存储空间,但是,这要求在首先对一个现有文件进行编码形成新的文件,也就是压缩。在文件使用时,再对压缩文件进行解压缩,也就是译码,复原原有文件。试为完成此功能,写一个压缩/解压缩软件(控制台程序,不要求界面)

【基本要求】(60%)

一个完整得系统应具有以下功能:
(1)压缩准备。读取指定被压缩文件,对文件进行分析,建立哈夫曼树,并给出分析结果(包括数据集大小,每个数据得权值,压缩前后文件得大小),在屏幕上输出。
(2)压缩。利用已建好的哈夫曼树,对文件进行编码,并将哈夫曼编码及文件编码后的数 据一起写入文件中,形成压缩文件(**.Haf)。
(3)解压缩。打开已有压缩文件(*.Haf),读取其中的哈夫曼编码,构建哈夫曼树,读取其 中的数据,进行译码后,写入文件,完成解压缩。
(4)程序使用命令行方式运行
压缩命令 :SZip A Test.Haf 1.doc
解压缩命令:SZip X Test.Haf 2.doc 或 SZip X Test.Haf
用户输入的命令不正确时,给出提示。
(5)使用面向对象的思想编程,压缩/解压缩、哈夫曼构建功能分别构建类实现。

【提高要求】(40%)

(1)采用不同的数据集,比较其压缩比,采用最有效的压缩方式。
(2)多个文件的压缩。
(3)试构建程序框架,使其能添加新的压缩/解压缩算法(例如书上 LZW 压缩算法)。

2.总体分析与设计

(1)设计思想:

【存储结构】

1、构建一个哈夫曼树结点的结构体,其中包括记录结点权值的数据元素、记录结点双亲位置及左右孩子位置的数据元素、记录结点哈夫曼编码的int型指针、记录结点哈夫曼树编码长度的数据元素。
2、利用动态数组来保存哈夫曼编码。
3、本题通过构建哈夫曼树来进行压缩和解压缩,当压缩式即从下至上建树,解压缩时即从上至下读树。

【主要的算法思想】

本题需要我们运用哈夫曼树的算法来实现软件的压缩和解压,而压缩即可以理解为从下至上建树,解压缩时即可以理解为从上至下读树。
在压缩时,我们首先要把需要压缩的文件用二进制的形式打开,然和把其中的字符转换成ascll码,然后进行对比,把具有相同ascll码的字符统计出来进行归类,并计算同类字符的权重,根据权重从下至上建立哈夫曼树,再生成哈夫曼编码(其中,权重大的结点哈夫曼编码短,权重小的结点哈夫曼编长,),然后把哈夫曼编码列出来后,8位进1(1Byte=8 Bit),当后面的哈夫曼编码不足八位时 则要在其后边进行补0后向进1,然后再将所有的字节输出到文件中,形成压缩文件。
在解压缩时,我们同样是要把需要解压缩的文件用二进制的方式进行打开,然后从上至下的读取哈夫曼树,读取哈夫曼编码,将哈夫曼编码装换成编码前对应的内容,即分别对应哈夫曼树中结点的内容,这里要注意的是我们读取的最后一个字节可能是不足8位的,所以我们要注意记录不足八位时的缺省个数,然后再分别对应哈夫曼树中的数据,从而实现解压操作,最后把解压后的内容输出即可。
最后编写计算文件内占用字节大小的函数,再根据占用内存大小计算压缩率;然后通过对比压缩前和解压后文件内每个字符是否一致来判断解压前和解压后的文件内容是否完全一致。

(2)设计表示:


(3)详细设计表示:

1、countFrequency()统计字符出现次数
首先以二进制方式打开文件,然后读取其中的字符,判断这个字符是否是第一次出现,如果是就把它初始化,然后叶子结点总数加一要是不是第一次出现,就把权值加1。
2、createHuffmanTree()建哈夫曼树
先找出两个权值最小的结点然后建树,一直到最后只有一棵树,为了减少压缩文件中需要写入的huffman树的信息,约定小标小的结点做为双亲结点的左孩子。
3、calculateCode() 计算哈夫曼编码
从下往上一直找到根节点,然后一层一层加,计算哈夫曼的长度然后再从上往下找,左孩子编码0,右孩子编码1。
4、addBit(int bit)对一个未满8bit的byte中加入一个bit
如果新增的为0,直接就左移;如果新增为1,就先左移然后与1按位或。
5、resetByte()将byte清空
将byte与byte中bit的个数都赋值0,即清空。
6、doCompress(…)压缩函数
调用前面编写的函数,首先计算每个字符的权值,再根据权值大小建立哈夫曼树,再给树上的结点进行哈夫曼编码,然后把哈夫曼树从上之下将结点位置写入输出文件;将字符的哈夫曼编码写入byte中,即八位算一字节,如果满了就输出字节,并将原字节清空,然后把不足8位的后面补0,然后输出,再清空。
7、doDecompress(…)解压函数
首先读出根节点的位置,然后确立各个几点之间的双亲关系(先左后右),然后方便读取 将数据放入队列,由于在压缩的时候是从上之下存入到文件当中的 所以这个时候直接依此弹出队顶元素即可实现从上至下读树,然后八位一循环,分别与哈夫曼树的左右孩子进行比较,找出哈夫曼编码最后一个字原本对应的内容,注意最后不足8位的字节要单独处理。

3.编码

1、编码过程中遇到一些问题,在建立huffman树时不知如何在压缩过程中同时进行编码和建树,不知如何存放编码,编码必须要存储才能建立有效的huffman树。后来想到可以用动态数组保存huffman编码,由于编码长度不定,用动态数组可以弥补这个空缺。
2、对于不满足八位的字符,最开始没预想到这种情况,压缩过程中出现错误,后来通过同学的提醒,才意识要进行补位的操作。若新增的bit为0,则直接将byte按位左移;新增的bit为1,先将byte按位左移,再与1按位或运算的规律进行补位操作。补位时,还需要预留一个字符,等压缩完后在该位置写入不足一个byte的bit个数。
3、在测试过程中,解压缩后的文件总是会比原文件大一点,而文件内容的最后总会出现一些乱码,后来通过调试和查找相关资料,我明白了,在ofstream中自带一种文件流指针,便于我们读取文件中的字符,在我压缩的过程当中,压缩到最后,这个文件流指针就走到了文件的最后,而该指针占用一i定的内存,所以在压缩过程中把该指针也进行了压缩,解压缩时自然也输出了该指针,所以会出现解压缩后的文件要比原文件大,所以我在压缩函数中增加了ofsFile.seekp(0, ios::beg);函数,将写指针移动到文件开头,从而解决了该问题。

4.程序及算法分析

【使用说明】


输入文件存储的位置,压缩/解压缩文件
(写博客的时候才发现,我这里给的执行命令好像和老师要求的执行命令不一样,不过是小问题哈哈,读者私下自己改一下好了

c++ 数据结构 软件压缩/解压缩软件Szip(Huffman算法及应用)相关推荐

  1. WinRAR压缩解压缩软件命令行参数

    WinRAR压缩解压缩软件命令行参数 时间:2010-08-09 09:50来源:互联网 作者:网络 点击: 7149次 Win7教程(www.win7soft.com):WinRAR压缩解压缩软件命 ...

  2. Mac OS平台开源的压缩解压缩软件——keka

    有时候需要在MAC上压缩文档,而它自带的压缩功能又有限,于是就到网上找到了一款开源的压缩解压缩软件--keka,用起来也很方便,只需要把要压缩的文档拖到Dock里keka的logo上即可. Keka的 ...

  3. Mac上比较好用的压缩解压缩软件

    在MacOs没有WinRAR,Bandizip等好用的功能强大而全面的压缩解压缩软件. 搜索一下,很多人推荐The Unarchiver,但是它没有压缩和预览功能,而商业 版的Bandizip,Bet ...

  4. bandzip和360解压_最优秀的压缩/解压缩软件—BandZip

    小伙伴们好鸭~ 今天为大家推荐一款解压缩类软件--BandZip 能够秒杀其他的压缩类软件 1 BandZip简介 BandZip是韩国的一款优秀的软件.支持多国语言,支持多种平台,当然软件也完美支持 ...

  5. 5个最好的免费压缩解压缩软件下载

    压缩软件可以把软件.图片.文档等文件的图片体积大幅减少,并且把所有文件进行打包,便于在带宽非常宝贵的互联网上传输和分享,能大大加快上传和下载的时间,下面介绍5个最好的免费压缩软件下载 ,希望你会喜欢: ...

  6. 免费的压缩/解压缩软件

    7zip, https://www.7-zip.org/download.html Bandizip

  7. war压缩命令_BetterZip mac版(超强解压缩软件)

    BetterZip for mac是一款功能强大的压缩软件,不必解压就能快速地检查压缩文档.它能执行文件之间的合并并提供密码.使用它,用户可以更快捷的向压缩文件中添加和删除文件.它支持包括zip.gz ...

  8. 常见解压缩软件与zip格式

    文章目录 1.常见解压缩软件 2.解压缩软件与其 zip 文件格式 3.小结 1.常见解压缩软件 国外软件: WinRAR.WinZip.7Zip .PKZip 等. 国内软件:2345好压(HaoZ ...

  9. mac 命令行 解压7z文件_命令行压缩解压缩一 7z

    命令行压缩解压缩一 7z 1) 简介 7z,全称7-Zip, 是一款开源软件.是目前公认的压缩比例最大的压缩解压缩软件. 主页:http://www.7-zip.org/ 中文主页:http://7z ...

最新文章

  1. 回归分析中的“回归”
  2. spoj 375 Query on a tree
  3. mysql开启perform sch_MySQL Performance schema设置的一些建议选项
  4. Android网络请求开源框架retrofit的基本GET用法(2.4版本)
  5. 学习笔记(29):Python网络编程并发编程-信号量
  6. 深入解读Service Mesh背后的技术细节
  7. 2019年蓝桥杯第一题
  8. jQuery特效:实现抽奖
  9. 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果及其他。
  10. java中时时检查代码中变量的值_如何调试JDK源代码并查看局部变量值
  11. 一个疫情期间的实习生经历
  12. Android开发工程师已难找工作
  13. 【游戏王arc-v卡片力量SP改名字ID教程】
  14. 使用计算机自适应测验大型测验,计算机自适应测验中测验安全控制方法评述.pdf...
  15. 激励人生10张英文励志海报
  16. Spark中Map和Json字符串相互转换
  17. WiFi认证过程需要的协议和服务
  18. 浅析PC机串口通讯流控制
  19. 知名站长工具服务商:爱站网突然关站
  20. Power BI面积图

热门文章

  1. 制药巨头测试IBM的区块链系统以改善临床试验
  2. 数据结构与算法(Python版)十五:无序表抽象数据类型及Python实现
  3. hdmi口不接显示器,teamviewer连接黑屏
  4. 如何用java打印1-100_在java中使用10个线程打印1到100
  5. csdn博客日志test1
  6. BEA助中国一汽构建核心ERP系统
  7. 编写SPI DAC驱动程序
  8. java红包正态分布_红包分配算法
  9. eclipse取消默认工作空间的两种方法
  10. 使用MDB查看变量的值