在Java中与吹气解压gzip压缩的数据(Decompressing gzipped data wi

2019-09-18 05:25发布

我试图与解压缩gzip压缩数据Inflater 。 根据该文件,

如果参数“nowrap”选项为真,那么ZLIB头和校验和字段将不会被使用。 这提供了与GZIP和PKZIP中使用的压缩格式的兼容性。

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

传递true的构造函数,然后试图在解压缩的数据结果DataFormatException: invalid block type被抛出。 继在说明这个答案 ,我添加了一个空字节来结束setInput()的参数,但无济于事。

我将不得不使用GZIPInputStream呢? 我究竟做错了什么?

Answer 1:

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

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

什么NOWRAP的意思是,原始放气数据将被解压缩。 一个gzip流是包裹着一个gzip首部和尾部的原始数据DEFLATE。 要完全解码这一类的gzip格式,你将需要处理gzip头信息中描述RFC 1952年 ,使用充气解压缩的原始DEFLATE数据,计算CRC32使用类的未压缩数据,然后验证CRC和长度(模2 ^ 32)在gzip的拖车,再次在指定的RFC 。



Answer 2:

我认为,阅读GZIP流是不够的,设置nowrap=true ,则还必须消耗gzip头,这是不压缩流的一部分。 例如参见 readHeader() 在此实现



文章来源: Decompressing gzipped data with Inflater in Java
标签: java gzip zlib