2012-07-18 36 views
0

我正在爲學習目的而編寫一個解壓縮GZIP文件的C程序。如何分隔GZIP文件中的塊?

按照GZIP spec

甲gzip文件由一系列 「成員」(壓縮數據集)中的。 每個成員的格式在以下部分中指定。 成員只是在文件中一個接一個地出現,沒有 之前,之間或之後的附加信息。

和一個構件(也許具有取決於一些標誌值可選字段),某些壓縮塊(使用DEFLATE算法)和最後的CRC32和原始未壓縮文件的大小由一個首部。

我有兩個問題:

  1. 如何界定成員?實際上,一個gzip文件中是否真的有多個成員?看起來,一個成員對應一個文件(例如文件名頭)
  2. 如何從尾部分隔最後一個塊(CRC + SIZE)?

回答

4

這並不常見,但您有時會在單個文件中看到串聯的gzip流。 gzip認爲這是一個單一的數據流,而不是多個「文件」,因此文件名被忽略。

如果通過「如何定義最後一個塊」來表示最後一個放氣塊,那麼最後一個放氣塊在它的頭部中只是有一點將其標記爲最後一個塊。最後的deflate塊之後是crc和未壓縮的長度(模2^32)。

+0

感謝您的回答,並且因爲我在「specs」中的某個地方讀到了您的名字;-)我在這裏問另外一個問題:我沒有調查過很多緊縮流壓縮,但是如何分隔這些塊?我只是把每個塊看作是一個頭,就像你說的最後一個塊一樣,但是我看不到「大小」信息。我如何知道什麼時候正在閱讀新的標題? – 2012-07-18 15:56:54

+0

放氣塊沒有大小前綴。相反,它們是以一個結束代碼自我終止的。當你到達結束碼時,你會尋找一個新的塊。或者,如果最後一個塊位被設置在該塊的開頭,則處理一個預告片。 – 2012-07-18 16:59:05

+0

再次感謝。你能確認這個結束代碼值是256嗎? – 2012-07-19 09:17:57

1

如何分隔成員?

成員不分隔。它們之間沒有分離,這就是爲什麼你可以將gzip文件壓縮到一起,就像你不使用gzip文件一樣。但是,一旦到達一個成員的末尾,就可以查找指示下一個成員開始的ID1 & ID2值。從規格:

這些具有固定值ID1 = 31(0x1f,\ 037),ID2 = 139(0x8b,\ 213),以標識文件爲gzip格式。

這可以讓你告訴除了文件末尾的垃圾之外的另一個成員的開始。

如果您希望跳到文件中的特定成員而不讀取其他所有成員,可以使用預先計算的索引,如CDX file provides

實際上,一個gzip文件中是否真的存在多個成員?

這是很常見的gzipped WARC files(用於存檔網站)。每條記錄都是一個單獨的成員,以方便尋求。但是,格式不依賴於此功能。

相關問題