使用Java中的Inflater解压缩gzip压缩数据

时间:2012-06-18 01:21:39

标签: java gzip zlib

我正在尝试使用Inflater解压缩gzip压缩数据。根据文档,

  

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

     

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

true传递给构造函数,然后尝试解压缩数据导致DataFormatException: invalid block type被抛出。按照this answer中的说明,我在setInput()参数的末尾添加了一个虚拟字节,但没有用。

我是否必须使用GZIPInputStream代替?我做错了什么?

2 个答案:

答案 0 :(得分:4)

Java文档不正确或至少具有误导性:

  

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

nowrap意味着原始的deflate数据将被解压缩。 gzip流是用gzip头和尾部包装的原始deflate数据。要使用此类完全解码gzip格式,您需要按RFC 1952中所述处理gzip标头,使用inflater解压缩原始deflate数据,使用该类计算未压缩数据的crc32 ,然后再次按照RFC中的规定验证gzip预告片中的crc和长度(模2 ^ 32)。

答案 1 :(得分:1)

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