文章分享:Gzip 格式和 DEFLATE 压缩算法详解

Introduction

引言: 当键入 tar -zcf src.tar.gz src 时,就可以将 src 下的所有文件打包成一个 tar.gz 格式的压缩包。这里的 “tar” 是归档格式,将多个文件组合成一个文件;而 “gz” 指的就是 gzip 压缩格式,使用 DEFLATE 算法压缩得到。DEFLATE 算法结合了 LZ77 算法和 Huffman 编码,为使用最广泛的无损压缩算法,本文详细介绍了其背后的原理。

推荐阅读文章:Gzip 格式和 DEFLATE 压缩算法详解

辅助阅读: 十款性能最佳的压缩算法

Q&A

1. 十款性能最佳的压缩算法中PZ77说的是距离文本开头的偏移量,材料中说的是当前文本向前的偏移量,两个好像不一样?到底是哪个呢?

其实两篇文章的表述都是正确的,只是有理论与实践之分,具体如下:

2. Huffman编码码表需要获取信源概率分布,当压缩大文件信源分布获取不充分,采用相同码表则会造成Huffman树平均搜索深度加深,Gzip该作何处理。
  • 为了高效地存储 Huffman 编码表, DEFLATE 算法规定, Huffman 树的每一层的叶子节点必须从这一层的最左侧开始, 按照 Huffman 编码的数值大小从小到大依次排列; 内部节点排列在随后. 此外同一层的字符应该按照字符表(如 ASCII 码表)的顺序依次排列
  • 根据实际情况选择动态Huffman编码压缩、静态Huffman编码压缩、不压缩,详见第四点
3. 不同压缩算法在性能、安全性、压缩率、压缩损失上有何优劣
  • 性能&压缩率可见以下网站

    Comparison of Compression Algorithms

  • 压缩损失方面,大概率使用的是无损压缩算法,当然也有场景使用有损压缩算法,在辅助阅读中有所提及

  • 安全方面,一般来说压缩算法是专注于压缩的功能,安全方面交由上层包装处理。如,GZIP压缩格式采用CRC32进行校验等。

4. 一个区块还有可能使用静态 Huffman 编码压缩或者不压缩,这个选择的依据有哪些,怎么实现的
  • 在LZ77压缩阶段,当匹配字符串长度小于3时,不编码,直接输出原格式,这点可见原文中「距离编码表」
  • 在上述的基于lz77的思想的字符串压缩处理之后,deflate会对处理后的字符串再进行一次huffman编码。具体步骤如下:
  1. 先进行动态huffman编码

    1. 统计处理后的字符串中每个字符出现的频率(ascii)
    2. 按照频率生成huffman树,进行huffman编码
  2. 再进行静态huffman编码(经验得到的码表,写死的一套huffman树规则)

    image-20220129144907324
  3. 比较静态huffman和动态huffman哪个压缩后更小,采用哪种huffman编码

  4. 当处理的编码长度达到4k后,会开始抉择是否进行huffman编码并生成数据块(头信息包含crc32,和用了哪种huffman编码)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值