我正在尝试使用Inflater
解压缩gzip压缩数据。根据文档,
如果参数'nowrap'为true,则为ZLIB头和校验和 字段将不会被使用。这提供了兼容性 GZIP和PKZIP使用的压缩格式。
注意:使用'nowrap'选项时,还需要提供 一个额外的“虚拟”字节作为输入。这是ZLIB本机所必需的 库,以支持某些优化。
将true
传递给构造函数,然后尝试解压缩数据导致DataFormatException: invalid block type
被抛出。按照this answer中的说明,我在setInput()
参数的末尾添加了一个虚拟字节,但没有用。
我是否必须使用GZIPInputStream
代替?我做错了什么?
答案 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