2012-06-18 80 views
3

我试图使用Inflater对gzip压缩的数据进行解压缩。根据文档,使用Java中的Inflater解压缩压缩数据

如果参数'nowrap'为true,那么将不会使用ZLIB标头和校验和 字段。这提供了与GZIP和PKZIP使用的压缩格式 的兼容性。

注意:使用'nowrap'选项时,还需要提供 额外的“虚拟”字节作为输入。这是ZLIB本地 库所需的,以支持某些优化。

传递true的构造函数,然后试图在DataFormatException: invalid block type解压缩的数据结果被抛出。按照this answer中的说明,我在setInput()的参数末尾添加了一个空字节,无济于事。

我需要用GZIPInputStream代替吗?我究竟做错了什么?

回答

4

Java文档不正确,或至少误导:

nowrap - 如果为true,则支持GZIP兼容的压缩

什么NOWRAP的意思是,原始放气数据将被解压缩。 gzip流是用gzip头和尾部包裹的原始缩放数据。要使用此类完全解码gzip格式,您需要按照RFC 1952中所述处理gzip头,使用inflater解压缩原始缩放数据,使用该类计算未压缩数据的crc32,然后验证crc和长度(modulo 2^32)在gzip预告片中,同样在RFC中指定。

+1

顺便说一句,他们还拼错了班级的名字。它应该是“充气机”。好吧。 –

1

我认为读取GZIP流是不够的,请设置nowrap=true,您还必须使用gzip头,该头不是压缩流的一部分。见例如。 readHeader()in this implementation