GZIP格式简介

 

 

 

 

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 文件 gzip-1.3.3.tar.gz 格式的簡要分析示意圖:

 

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

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

[ 相關資源 ]

·   GZIP 官方網站: www.gzip.org

·   RFC 1950 - ZLIB Compressed Data Format Specification version 3.3

·   RFC 1951 - DEFLATE Compressed Data Format Specification version 1.3

·   RFC 1952 - GZIP file format specification version 4.3

·   科腦工作室 (Kernel Studio) www.kernelstudio.com

 


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值