Adam-Xi / GZIP-FileComress

练手小项目,基于LZ77算法和Huffman算法的GZIP压缩
1 stars 0 forks source link

title: README.md author: Adam-Xi date: 2020-02-24

前言

文件压缩概念

数据压缩是指在不丢失有用信息的前提下,缩减数据量以减少存储空间,提高其传输、存储和处理效率,或按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间的一种技术方法

必要性

    1. 紧缩数据存储容量,减少存储空间
    1. 可以提高数据传输的速度,减少带宽占用量,提高通讯效率
    1. 对数据的一种加密保护,增强数据在传输过程中的安全性

      文件压缩分类

  • 有损压缩 有损压缩是利用了人类对图像或声波中的某些频率成分不敏感的特性,允许压缩过程中损失一定的息;虽然不能完全恢复原始数据,但是所损失的部分对理解原始图像的影响缩小,却换来了大得多的压缩比,即指使用压缩后的数据进行重构,重构后的数据与原来的数据有所不同,但不影响人对原始资料表达的信息造成误解
  • 无损压缩 对文件中数据按照特定的编码格式进行重新组织,压缩后的压缩文件可以被还原成与源文件完全相同的格式,不会影响文件内容,对于数码图像而言,不会使图像细节有任何损失,如接下来的GZIP算法就是无损压缩

GZIP压缩算法

GZIP压缩算法经历了两个阶段:

LZ77算法

LZ77是基于字节的通用压缩算法,它的原理就是将源文件中的重复字节(即出现在前文中出现的重复字节)使用(offset, length, netchar)的三元组进行替换
但是GZIP中的LZ77压缩算法并没有采用三元组进行替换,因为nextchar是否出现在三元组中对压缩率的提升并不能起到什么作用,因此GZIP采用<长度,距离>对的方式进行替换

压缩思路

查找最小匹配(采用哈希桶的方式):

压缩流程

压缩
压缩数据保存格式

压缩数据分为两个文件保存

解压缩

Huffman算法

在前面使用LZ77变形思想对源数据进行语句的重复压缩之后,语句层面的重复性已经解决,但并不代表压缩效果已经达到最大,字节层面可能也存在着大量重复
由此,GZIP算法中引入了Huffman的思想

压缩

压缩文件格式

解压缩

GZIP算法性能测试

使用Beyond Compare4对文件压缩前后进行比较,格式、数据等完全一致

  1. 对.txt、.doc、.docx、.pdf等文档格式文件压缩效率区间为50%~98%,其中,.txt文件压缩效果最好,普遍为55%~80%
  2. 对.jgp、.png等图片格式文件压缩效率区间为80%~95%
  3. 对.mp3、.flac等音频格式文件压缩效率区间为75%~100%
  4. 对.avi、.flv等视频格式文件压缩效率为80%~100%
  5. 对.exe等的可执行程序格式文件压缩效率为85%~100%
    经过简单的测试可以看出,GZIP算法对文档文件压缩效率较高,但是同时耗时较长

路遇问题及解决方法

待改进