2010-08-13 80 views
1

我想知道如何確定一個文件中包含多少個zlib文件。如何查找一個zlib文件中有多少個zlib文件?

一個例子;認爲我有5個不同的文件,並使用zlib單獨壓縮它們。然後我結合他們。所以,我有一個文件包含5個不同的zlib文件。現在,我怎樣才能找到這個文件中有多少個zlib文件?我只需要在一個文件中找出zlib文件的數量。我想,我需要轉儲它的十六進制代碼和grep一些神奇的數字,但無法弄清楚如何做到這一點。

你能幫我嗎?

回答

2

塊的長度未存儲在zlib編碼數據中(non-compressed block除外)。相反,塊的結尾由流中的標記[256]表示。但是這個標記是霍夫曼編碼的,霍夫曼編碼通常是dynamically generated,所以它對於每個塊可以是不同的。此外,編碼的令牌可能從字節的任何位開始,因此無法「grep」它。查找塊標記結束的唯一方法是對整個塊進行解碼並檢查以查看您何時點擊該標記。

我想你應該看看你的容器是否包含任何長度信息,並用它來找出壓縮數據的時間長度。

有關zlib格式的詳細信息,請參見RFC 1950以及相關的DEFLATE規範,即RFC 1951

+0

是的,我知道。讓我這樣說吧;我有一個容器有多個zlib文件。我如何查找該容器中有多少個zlib文件? – merinn 2010-08-13 23:25:58

+0

@merinn:你在使用什麼「容器」?我認爲容器的格式比zlib的格式更重要。 – 2010-08-13 23:31:14

+0

@merinn:Zlib不壓縮文件 - 壓縮數據。沒有'zlib文件'這樣的東西。 – 2010-08-13 23:40:13

1

如果您的單個文件是多個gzip文件的串聯,那麼您可以找到文件數量的上限。 Gzip格式以魔術0x1f8b開頭。

計算單個文件中魔術的出現次數。計數表明您最多隻有很多文件。不幸的是,這是一個上限而不是確切數量的文件。因爲0x1f8b也可能出現在64K字節的數據段中。爲了減少約24萬字節中的1個錯誤匹配,您可以改爲掃描0x1f8b08。尾部0x08是始終爲8的「壓縮方法」字段。

該「過濾器」的進一步改進是可能的。請參閱RFC1952的FLG字段。

如果單個文件的成員不是gzip格式,但是Zlib或raw格式,那麼你運氣不好;你必須解壓才能計算文件的數量 - 不管我怎麼做。