2013-05-14 63 views
0

這是一個特定於DEFLATE算法的問題,但涉及到gzip和zlib。從刷新點恢復DEFLATE解壓縮

假設我有一個gzip文件,我知道文件中有幾個刷新點。其中一些是使用Z_SYNC_FLUSH和其他Z_FULL_FLUSH進行的。如果我通過文件掃描,我可以找到所有的沖洗點,因爲他們立即遵循0000ffff的模式。

我知道我可以在Z_FULL_FLUSH點恢復解壓縮,因爲解壓縮所需的所有信息都可用(IE:字典被重置)。但是,如果我試圖從Z_SYNC_FLUSH解壓縮,我通常會得到一個「zlib.error:錯誤-3,同時解壓縮:無效距離太遠」錯誤。

問題是這樣的:如果我嘗試從Z_SYNC_FLUSH點解,我保證可以之一:

  1. 正確解壓縮塊和後續塊
  2. 失敗,出現「距離太遠」錯誤

換句話說,我保證我永遠不會以不良數據進行靜默解壓縮(我不是在討論gzip結尾處的CRC32檢查,而是zlib是否會大聲抱怨)?

假設:

  1. 假設我能夠完全識別刷新點。讓我們假裝我不會將隨機比特識別爲同步標記,也不會將模式恰好出現在類型0塊中。這是不現實的,但只是假設它是真實的。
  2. 假設文件永遠不會損壞,並且始終是合法的gzip文件。

回答

1

如果Z_SYNC_FLUSH結果在隨後的流,不給的距離太遠的錯誤,那麼,意外,相當於和無法區分Z_FULL_FLUSH。

我不希望這經常發生。

+0

謝謝。這是我懷疑的。 – DSnet 2013-05-14 04:02:50

+0

作爲後續問題... 在我通過文件中途識別Z_SYNC_FLUSH點的情況下,如果我以某種方式確切地知道前面的32KiB未壓縮數據是什麼,我可以始終使用inflateSetDictionary()從該解壓縮開始上? – DSnet 2013-05-16 04:58:24

+0

是的。 .......... – 2013-05-16 05:20:53