天天看点

gz文件Header 解析

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

继续阅读