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中的相反。
posted @ 2016-10-15 21:58  cloudren2020  阅读(2591)  评论(0编辑  收藏  举报