3

我正在尝试使用Inflater. 根据文档,

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

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

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

我必须GZIPInputStream改用吗?我究竟做错了什么?

4

2 回答 2

5

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

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

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

于 2012-06-18T04:55:37.587 回答
2

我认为要读取 GZIP 流,设置是不够的nowrap=true,您还必须使用 gzip 标头,它不是压缩流的一部分。参见例如。readHeader() 在这个实现中

于 2012-06-18T01:43:55.480 回答