【问题标题】:Decompressing gzipped data with Inflater in Java在 Java 中使用 Inflater 解压缩 gzipped 数据
【发布时间】:2012-06-20 00:31:54
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java gzip zlib


    【解决方案1】:

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

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

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

    【讨论】:

    • 顺便说一句,他们也拼错了班级的名字。它应该是“充气机”。哦,好吧。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多