Gzip(GNU zip)是一种广泛使用的文件压缩格式和工具,由Jean-loup Gailly和Mark Adler创建。Gzip通常用于UNIX和GNU系统中,以减少文件大小和传输时间。Gzip不仅提供高压缩率,还支持解压缩和验证数据完整性。
gzip 格式概述
gzip 文件格式由以下几个部分组成:
- 文件头部(Header)
- 压缩数据体(Compressed Data)
- 文件尾部(Footer,也称为Trailer)
详细结构
Header(头部)
至少有10个字节,具体结构如下:
- ID1(1 byte):恒定为 0x1F,标识gzip文件。
- ID2(1 byte):恒定为 0x8B,与ID1一起表示gzip。
- CM(1 byte):压缩方法,目前恒定为 0x08,表示 DEFLATE 压缩方法。
- FLG(1 byte):标志位,有额外数据时设置特定位。
- MTIME(4 bytes):文件的原始修改时间,以 Unix 时间戳形式表示。
- XFL(1 byte):操作系统标志位,具体含义因实现不同而不同。
- OS(1 byte):表示创建文件的系统(例如,0x03 表示 UNIX)。
根据 FLG 字段的设置,Header 后可能还会有其他可选字段,例如:
- 额外标头(Extra Header)
- 文件名
- 注释
- 头部校验和(Header CRC16)
Compressed Data(压缩数据体)
这部分包含用DEFLATE方法压缩的数据。
Footer(尾部)
总共为8个字节:
- CRC32(4 bytes):原始未压缩数据的CRC32校验和,用于验证数据完整性。
- ISIZE(4 bytes):未压缩的输入数据大小模 2^32,用于确认数据完整性。
实战
我在 Fiddler 抓包时,遇到返回数据为 gzip 格式时
可以把二进制的数据保存到本地
尾部也要注意不要全选
右键-> Save Selected Bytes...
然后使用 Python 脚本解析
import gzip
# 读取 gzip 文件并打印解压后的内容
with gzip.open('response/yungu_detail.gz', 'rb') as f:
decompressed_content = f.read()
print(decompressed_content.decode())
得到以下的输出