2012-10-31 36 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,但所有的数据都会被写入。