gz文件Header 解析

来源:互联网 发布:加工中心铣圆编程 编辑:程序博客网 时间:2024/05/21 17:08

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, \037); 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     加入文件名字,文件名以'\0'结尾
     bit 4   FCOMMENT  加入其他说明,以'\0'结尾
     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