GZIP数据格式讲解
背景:
协议解析时,碰到二进制数据,有些内容可以识别的,比如说带着特征1F8B08:代表着gzip数据出现了故想了解下gzip是怎么回事!
From:http://www.tuicool.com/articles/YRzqUv
GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNIX系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常 使用GZIP压缩技术来让用户感受更快的速度。
GZIP本身只是一种文件格式,其内部通常采用DEFLATE数据格式,而DEFLATE采用LZ77压缩算法来压缩数据。
GZIP文件由1到多个“块”组成,实际上通常只有1块。每个块包含头、数据和尾三部分。块的概貌如下:
+---+---+---+---+---+---+---+---+---+---+========//========+===========//==========+---+---+---+---+---+---+---+---+
|ID1|ID2| CM|FLG| MTIME |XFL| OS| 额外的头字段 | 压缩的数据 | CRC32 | ISIZE |
+---+---+---+---+---+---+---+---+---+---+========//========+===========//==========+---+---+---+---+---+---+---+---+
1. 头部分
- ID1(1 byte)与ID2(1 byte):固定值,ID1 = 31 (0x1F),ID2 = 139(0x8B),GZIP格式标志。
- CM(1 byte):压缩方法(0..7 reserved, 8 = deflate)。
- FLG(1 byte):标志位。
- bit 0 set: 文件可能是ASCII文本文件
bit 1 set: 附加多个gzip文件部分
bit 2 set: 存在有可选的附加 内容
bit 3 set: 提供了原始的文件名称
bit 4 set: 则提供有一个O-终结的文件内容
bit 5 set: 文件被加密
bit 6,7: 保留 - MTIME(4 byte):文件更改时间(Unix时间)
- XFL(1 byte):附加的标志,决定了压缩方法。当CM = 8时,XFL = 2 – 最大压缩但最慢的算法;XFL = 4 – 最快但最小压缩的算法
- OS(1 byte):这个标志指明了进行压缩时系统的类型。
- 0 – FAT filesystem (MS-DOS, OS/2, NT/Win32)
1 – Amiga
2 – VMS (or OpenVMS)
3 – Unix
4 – VM/CMS
5 – Atari TOS
6 – HPFS filesystem (OS/2, NT)
7 – Macintosh
8 – Z-System
9 – CP/M
10 – TOPS-20
11 – NTFS filesystem (NT)
12 – QDOS
13 – Acorn RISCOS
255 – unknown
额外的头字段:
(若 FLG.FEXTRA = 1)
+---+---+---+---+===============//================+ |SI1|SI2| XLEN | 长度为XLEN字节的可选项 | +---+---+---+---+===============//================+
(若 FLG.FNAME = 1)
+=======================//========================+
| 原文件名(以NULL结尾) |
+=======================//========================+
(若 FLG.FCOMMENT = 1)
+=======================//========================+
| 注释文字(只能使用iso-8859-1字符,以NULL结尾) |
+=======================//========================+
(若 FLG.FHCRC = 1)
+---+---+ | CRC16 | +---+---+
存在额外的可选项时,SI1与SI2指示可选项ID,XLEN指示可选项字节数。如 SI1 = 0×41 (‘A’),SI2 = 0×70 (‘P’),表示可选项是Apollo文件格式的额外数据。
2. 数据部分
DEFLATE数据格式,包含一系列子数据块。子块概貌如下:
+......+......+......+=============//============+ |BFINAL| BTYPE | 数据 | +......+......+......+=============//============+
- BFINAL:1比特。0 – 还有后续子块;1 – 该子块是最后一块。
- BTYPE:2比特。00 – 不压缩;01 – 静态Huffman编码压缩;10 – 动态Huffman编码压缩;11 – 保留。各种情形的处理过程,请参考后面列出的RFC文档。
3. 尾部分
- CRC32(4 byte):这个是未压缩数据的循环冗余校验值。
- ISIZE(4 byte):这是原始数据的长度以2的32次方为模的值。GZIP中字节排列顺序是LSB方式,即Little-Endian,与ZLIB中的相反。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)