1. 程式人生 > >GZIP, ZLIB, DEFLATE, 檔案格式

GZIP, ZLIB, DEFLATE, 檔案格式

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與ID2:各1位元組。固定值,ID1 = 31 (0x1F),ID2 = 139(0x8B),指示GZIP格式。 CM:1位元組。壓縮方法。目前只有一種:CM = 8,指示DEFLATE方法。 FLG:1位元組。標誌。

bit 0 FTEXT - 指示文字資料
bit 1 FHCRC - 指示存在CRC16頭校驗欄位
bit 2 FEXTRA - 指示存在可選項欄位
bit 3 FNAME - 指示存在原檔名欄位
bit 4 FCOMMENT - 指示存在註釋欄位
bit 5-7 保留

MTIME:4位元組。更改時間。UINX格式。 XFL:1位元組。附加的標誌。當CM = 8時,XFL = 2 - 最大壓縮但最慢的演算法;XFL = 4 - 最快但最小壓縮的演算法 OS:1位元組。作業系統,確切地說應該是檔案系統。有下列定義:

0 - FAT檔案系統 (MS-DOS, OS/2, NT/Win32)
1 - Amiga
2 - VMS/OpenVMS
3 - Unix
4 - VM/CMS
5 - Atari TOS
6 - HPFS檔案系統 (OS/2, NT)
7 - Macintosh
8 - Z-System
9 - CP/M
10 - TOPS-20
11 - NTFS檔案系統 (NT)
12 - QDOS
13 - Acorn RISCOS
255 - 未知

額外的頭欄位:

(若 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 = 0x41 ('A'),SI2 = 0x70 ('P'),表示可選項是Apollo檔案格式的額外資料。

2. 資料部分

DEFLATE資料格式,包含一系列子資料塊。子塊概貌如下:

+......+......+......+=============//============+
|BFINAL|    BTYPE    |            資料           |
+......+......+......+=============//============+
BFINAL:1位元。0 - 還有後續子塊;1 - 該子塊是最後一塊。 BTYPE:2位元。00 - 不壓縮;01 - 靜態Huffman編碼壓縮;10 - 動態Huffman編碼壓縮;11 - 保留。

各種情形的處理過程,請參考後面列出的RFC文件。

3. 尾部分

CRC32:4位元組。原始(未壓縮)資料的32位校驗和。 ISIZE:4位元組。原始(未壓縮)資料的長度的低32位。

GZIP中位元組排列順序是LSB方式,即Little-Endian,與ZLIB中的相反。

GZIP與ZLIB有著很深的淵源。有關ZLIB, GZIP以及DEFLATE等更加詳細的說明,可參考RFC 1950-1952。從這些文件裡也能找到其它的參考文獻。

GZIP已成為GNU Project的一個組成部分,其官方站點為www.gzip.org。在這裡可以下載到GZIP原始碼。目前最新版本是1.2.4,以及beta版的1.3.3。