GZ (*.gz)是Unix系统下一种很常用的压缩文件格式(windows下也可用)。本文主要说明一下gz文件header部分的内存布局。
注释图形说明
+--- +
| | <-- 每个这种格子代表一个字节(byte)
+ ---+
+==============+
| | <-- 这种格子代表多个字节
+==============+
1.gz header的最基本结构如下
+ ---+ --- + ---- +-----+---+---+---+---+----+ ---- +
| ID1| ID2| CM | FLG| MTIME |XFL| OS | (more-->)
+--- + --- + ---- + ---- +---+---+---+---+----+ ---- +
2. 格式说明
ID1 和 ID2
为gzip格式标志,为固定值 ID1 = 31(0x1f, 37); ID2 = 139(0x8b, 213)
CM (压缩方法)
0-7bit为保留位,8 = deflate
FLAG
这个字节被分为8个bit
bit 0 FTEXT 此文件可能为ASCII码文件,但大多情况下都不设置此bit
bit 1 FHCRC 在gzip[1.2.4]之前从不设置此bit
bit 2 FEXTRA 表示在gz header基本结构基础上加入其他信息
bit 3 FNAME 加入文件名字,文件名以' '结尾
bit 4 FCOMMENT 加入其他说明,以' '结尾
bit 5 reserved 此 bit 保留
bit 6 reserved 此 bit 保留
bit 7 reserved 此 bit 保留
MTIME
指示最近修改时间(格式为Unix时间戳),表示距离1970年1月1日 00:00:00 GMT所经历的秒数(SEC)。
XFL
当设置了CM=8后,此bit可用,指代压缩方法。XFL = 2 : 最大压缩率,速度最慢的算法; XFL = 4 : 最快的压缩算法。
OS
指示操作系统
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 - unknow
3. Extra Field
如果设置了FLAG.FEXTRA,则在基本结构后会增加如下结构
XLNE: 额外数据的字节长度(byte)
+---+---+=================================+
| XLEN | ...XLEN bytes of "extra field"... | (more-->)
+---+---+=================================+
XLEN后面的子field也有特定的格式,其格式如下:
+----+----+----+----+==========================+
|SI1 | SI2| LEN |... LEN bytes of subfield data ... |
+----+----+----+----+==========================+
SI1 和 SI2 为子field的标志, LEN为子field的数据长度(byte)
SI1 SI2 LEN Data
---------- ---------- ---- ----------------------------
0x41 ('A') 0x70 ('P') 29 Apollo file type information
REF: http://www.zlib.org/rfc-gzip.html