Gzip 压缩格式了解

837 阅读2分钟

Gzip(GNU zip)是一种广泛使用的文件压缩格式和工具,由Jean-loup GaillyMark Adler创建。Gzip通常用于UNIX和GNU系统中,以减少文件大小和传输时间。Gzip不仅提供高压缩率,还支持解压缩和验证数据完整性。

gzip 格式概述

gzip 文件格式由以下几个部分组成:

  1. 文件头部(Header)
  2. 压缩数据体(Compressed Data)
  3. 文件尾部(Footer,也称为Trailer)

详细结构

Header(头部)

至少有10个字节,具体结构如下:

  1. ID1(1 byte):恒定为 0x1F,标识gzip文件。
  2. ID2(1 byte):恒定为 0x8B,与ID1一起表示gzip。
  3. CM(1 byte):压缩方法,目前恒定为 0x08,表示 DEFLATE 压缩方法。
  4. FLG(1 byte):标志位,有额外数据时设置特定位。
  5. MTIME(4 bytes):文件的原始修改时间,以 Unix 时间戳形式表示。
  6. XFL(1 byte):操作系统标志位,具体含义因实现不同而不同。
  7. OS(1 byte):表示创建文件的系统(例如,0x03 表示 UNIX)。

根据 FLG 字段的设置,Header 后可能还会有其他可选字段,例如:

  • 额外标头(Extra Header)
  • 文件名
  • 注释
  • 头部校验和(Header CRC16)

Compressed Data(压缩数据体)

这部分包含用DEFLATE方法压缩的数据。

Footer(尾部)

总共为8个字节:

  1. CRC32(4 bytes):原始未压缩数据的CRC32校验和,用于验证数据完整性。
  2. ISIZE(4 bytes):未压缩的输入数据大小模 2^32,用于确认数据完整性。

实战

我在 Fiddler 抓包时,遇到返回数据为 gzip 格式时

image.png

可以把二进制的数据保存到本地

image.png

尾部也要注意不要全选

image.png

右键-> Save Selected Bytes...

image.png

然后使用 Python 脚本解析

import gzip
# 读取 gzip 文件并打印解压后的内容
with gzip.open('response/yungu_detail.gz', 'rb') as f:
    decompressed_content = f.read()

print(decompressed_content.decode())

得到以下的输出

image.png