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

Ale*_*orm 3 java gzip zlib

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

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

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

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

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

Mar*_*ler 5

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

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

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

  • 顺便说一句,他们还拼错了班级的名称。应该是“充气机”。那好吧。 (2认同)