2012-10-31 35 views
5

我認爲有一種方法可以做到這一點,但我不知道如何?基本上,我正在編寫一個壓縮程序,當我嘗試解壓縮壓縮數據時導致crc錯誤。通常這意味着解壓縮者實際上將我的數據識別爲正確的格式並對其進行解壓縮,但是當它將結果與CRC所指示的預期長度進行比較時,它們並不相同。儘管CRC錯誤,強制gzip解壓縮

但是,出於比較的原因,我確實希望看到輸出以查看它是否僅僅是一個串聯問題(如果解壓縮的輸出不是亂碼,而只是錯誤順序,這應該相對明顯)。

回答

0

據我所知,CRC校驗是GZIP包裝的一部分,而不是DEFLATE格式的實際壓縮數據的一部分。

因此,您應該能夠從字面上理解壓縮數據流的字節,忽略最後的GZIP頭和CRC,並將其傳遞給Inflater。

換句話說,您只需要取對應於GZIP File format specification中被稱爲「壓縮塊」的字節,並嘗試使用Java Inflater對象進行解壓縮。一些工作,但可能不如Greg所說的那樣重新編譯GZIP代碼(儘管他的選擇原則上也適用)。

8

你說「解壓縮」,但問題是「gzip」。這是什麼?這是兩種不同的程序,它們以兩種不同的格式運行。我會假設gzip。此外,長度不是「由CRC指示」。 gzip預告片包含一個CRC和一個未壓縮的長度(模數爲2 ),這是兩個不同的事情。

gzip命令將解壓縮所有有效的deflate數據並在檢查crc之前寫出它。所以,如果,例如,我走在最後一個.gz文件和腐敗只是CRC(或長度),然後執行:

gzip -dc <corrupt.gz> result 

那麼結果將是整個的,正確的未壓縮數據流。不需要修改和重新編譯gzip,也不需要編寫自己的ungzipper。 gzip會抱怨crc,但所有的數據都會被寫入。