2012-01-29 37 views
41

在我的項目中,我需要知道什麼是zlib標題。我聽說這很簡單,但我找不到zlib標題的任何描述。zlib標題是什麼樣的?

例如,它是否包含一個幻數?

回答

52

Link to RFC

0 1 
+---+---+ 
|CMF|FLG| 
+---+---+ 

CMF(壓縮方法和標誌) 這個字節被劃分成一個4位的壓縮方法和4- 位信息字段依賴於壓縮方法。

bits 0 to 3 CM  Compression method 
bits 4 to 7 CINFO Compression info 

CM(壓縮方法) 此標識該文件中使用的壓縮方法。 CM = 8 表示窗口大小爲 至32K的「放氣」壓縮方法。這是gzip和PNG 以及其他幾乎所有的方法。 CM = 15被保留。

CINFO(壓縮信息) 對於CM = 8,CINFO是LZ77窗口 尺寸的基2對數,減去八(CINFO = 7指示32K窗口大小)。在此版本的 規範中,不允許CINFO值大於7的值爲 。 CINFO未在本說明書中對於 CM不等於8

在實踐中定義的,這意味着第一個字節是幾乎總是78(十六進制)

FLG(標誌) 該標誌字節被劃分如下:

bits 0 to 4 FCHECK (check bits for CMF and FLG) 
bit 5  FDICT (preset dictionary) 
bits 6 to 7 FLEVEL (compression level) 

的FCHECK值必須是使得CMF和FLG,作爲 觀看存儲在MSB順序(CMF * 256 + FLG)一個16位無符號整數時, 是31的倍數。

FLEVEL(壓縮級別) 這些標誌可供特定壓縮方法 使用。在 「放氣」 法(CM = 8)設置這些標誌作爲 如下:

 0 - compressor used fastest algorithm 
     1 - compressor used fast algorithm 
     2 - compressor used default algorithm 
     3 - compressor used maximum compression, slowest algorithm 
+0

這是一個很好的答案:),幫助我在很多方面......嘿!不錯的頭像 – Ryan 2014-12-16 20:30:47

74

zlib的魔術頭

78 01 - No Compression/low 
78 9C - Default Compression 
78 DA - Best Compression 
+0

這幫助我找出了我正在處理的壓縮類型。我知道這個文件被壓縮了,但是正在搜索一些頭字節,並且出現了。謝謝! – ProVega 2014-02-01 05:41:38

+4

當使用Java Inflator(使用ZLIB)時,我看到標頭值爲120,-100。這相當於78 9C。備份你上面說的。 – Dan 2014-10-02 21:33:08

10

以下是zlib壓縮數據格式。

+---+---+ 
|CMF|FLG| (2 bytes - Defines the compression mode - More details below) 
+---+---+ 
+---+---+---+---+ 
|  DICTID | (4 bytes. Present only when FLG.FDICT is set.) - Mostly not set 
+---+---+---+---+ 
+=====================+ 
|...compressed data...| (variable size of data) 
+=====================+ 
+---+---+---+---+ 
|  ADLER32 | (4 bytes of checksum) 
+---+---+---+---+ 

大多數情況下,FLG.FDICT(字典標誌)未設置。在這種情況下,DICTID根本不存在。所以,總聽到只是2個字節。

沒有字典的標題值(CMFFLG)定義如下。

CMF | FLG 
0x78 | 0x01 - No Compression/low 
0x78 | 0x9C - Default Compression 
0x78 | 0xDA - Best Compression 

更多的ZLIB RFC

0

所有答案在這裏是最有可能是正確的,但是 - 如果你要直接操作zlib壓縮流,它是通過使用gz_open, gzwrite, gzclose功能產生的 - 然後有額外的10個前導字節zlib壓縮蒸汽前頭部來 - 那些按功能gz_open生產 - 頭看起來是這樣的:

fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], 
     Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); 

,並導致以下十六進制轉儲:1F 8B 08 00 00 00 00 00 00 0B ,然後是zlib壓縮流。

,但也有8個字節後綴 - 他們是uLong - CRC在整個文件,uLong - 未壓縮文件大小 - 尋找在流結束後字節:

putLong (s->file, s->crc); 
    putLong (s->file, (uLong)(s->in & 0xffffffff)); 
4

ZLIB/GZIP頭

Level | ZLIB | GZIP 
    1 | 78 01 | 1F 8B 
    2 | 78 5E | 1F 8B 
    3 | 78 5E | 1F 8B 
    4 | 78 5E | 1F 8B 
    5 | 78 5E | 1F 8B 
    6 | 78 9C | 1F 8B 
    7 | 78 DA | 1F 8B 
    8 | 78 DA | 1F 8B 
    9 | 78 DA | 1F 8B 

放氣沒有共同的標題

+0

我看到你提出了兩個當前票數較高的答案的重大變化。這將大大改變答案。請不要提出這樣的編輯。相反,當你有足夠的聲望時,你應該發表評論。 – 2017-04-02 17:15:57