文件压缩

Huffman树压缩文件

定义:Huffman树,又称最优二叉树,是加权路径长度最短的二叉树

建立:

文件压缩_第1张图片

这样建立的树,保证所有数据成员都在叶子结点上,且数越小,离根结点越远,越大,离根结点越近,那么这样的特点应用于压缩中很是关键的,我们可以让出现次数少的编码长一些,次数多的字符编码短一些,下面是压缩步骤

1.统计压缩文件中字符出现的格式

   遍历一遍文件,将字符出现的次数统计在一个结构体数组里,数组里包含字符,字符出现的次数,对该字符的编码

2.用得到数组构建一个Huffman树

   因为这里每次要取最小值,所以这里要考虑键一个小堆

3.得到Huffman编码

   向右为1,向左为0

文件压缩_第2张图片

原本用一个char表示的字符,现在只占了几个比特位,这就是为什么可以压缩

4.向压缩文件里写入Huffman编码

   写入的时候,满8个位写进去,如果最后不足8个位,先补齐,解压的时候要注意,解压到源文件字符数的时候停止即可,源文件的总字符数可以在第一次遍历时统计出现的字符数,还有一种方法就是,仔细观察Huffman树就知道,它的根结点的大小,其实就是所有叶子结点相加和,因此,根结点的大小就是源文件里所有字符出现额总次数

5.建立配置文件

   配置文件里要存储文件字符及出现的次数,有了这样的配置文件,就可以再次构建Huffman树

解压缩文件

1.读取配置文件,重新构建Huffman树 

2.读取压缩文件

   由压缩时的原理可知,此时读到1指针向右移动,0向左移,到叶子结点停下,将字符还原。不停地循环,直到文件结束或总字符数变为0,这里就能体现出,Huffman压缩是一种无损的压缩;如果代码没有问题,它会原原本本的还原源文件。

遇到的问题

1.编译时不通过,一大堆的错误,找了半天,是一个很简单的问题,我的Huffman树使用的是c++模板实现的,模板不能分离编译,而我在压缩时建立Huffman树是在另外一个文件中进行的,所以不能通过

解决办法:.h改为.hpp

2. 文件的打开方式,这里打开文件一定要有二进制形式,"wb","rb",因为二进制打开和文本打开其实是有区别的,文本方式打开,会对'\n'进行特殊处理,那么如果这个字符本身就是‘\n’,就会出现问题,所以使用二进制打开,特点:不进行任何处理,是什么就是什么

最后文件大了,怎么对比这两个文件是否一致呢,我用的是beyond Compare这个软件

项目测试:

(1)了解项目需求:

背景:磁盘空间不够,需要一个压缩解压缩文件

(2)需求分析

  • 文件类型(图片,文档,视频)
  • 压缩文件个数
  • 安全需求
  • 界面需求

(3)制定测试方案

  • 测试的范围及测试点:压缩,解压缩文件
  • 测试方法:手工
  • 测试所涉及的类型:功能,性能,安全,兼容,界面,易用性
  • 测试工具:禅道

(4 )编写测试用例

文件压缩_第3张图片

(5)冒烟测试

压缩,解压缩功能正常

(6)测试执行

(7)输出测试报告

(8)版本发布

(9)项目总结

你可能感兴趣的:(文件压缩)