【问题标题】:Force gzip to decompress despite CRC error尽管出现 CRC 错误,仍强制 gzip 解压缩
【发布时间】:2012-10-31 00:53:15
【问题描述】:

我认为有办法做到这一点,但我不知道怎么做?基本上,我正在编写一个压缩程序,当我尝试解压缩压缩数据时导致出现 crc 错误。通常这意味着解压缩器实际上将我的数据识别为正确的格式并对其进行解压缩,但是当它将结果与 CRC 指示的预期长度进行比较时,它们并不相同。

但是,出于比较的原因,我实际上确实希望查看输出,看看它是否只是一个串联问题(如果解压缩的输出不是乱码而是顺序错误,这应该是相对明显的)。

【问题讨论】:

  • 与您的主题不完全相关,但 JFI:我从 gz 文件中删除了 crc,并使用 Content-Encoding: gzip 从服务器返回它,它已被 Chrome 和 Firefox 正确解压缩。这意味着浏览器不检查 CRC。这对于提供预压缩文件很有用

标签: java gzip compression


【解决方案1】:

您说的是“解压缩”,但问题是“gzip”。它是哪一个?这是两个不同的程序,它们以两种不同的格式运行。我将假设gzip。此外,长度不是“由 CRC 指示的”。 gzip 预告片包含一个 CRC 和一个未压缩的长度(模 232),这是两个不同的东西。

gzip 命令将解压所有有效的 deflate 数据并在检查 crc 之前将其写出。因此,例如,如果我使用一个 .gz 文件并在最后损坏了 crc(或长度),然后执行以下操作:

gzip -dc < corrupt.gz > result

那么结果将是完整的、正确的未压缩数据流。无需修改和重新编译gzip,也无需编写自己的ungzipper。 gzip 会抱怨 crc,但仍然会写入所有数据。

【讨论】:

    【解决方案2】:

    据我所知,CRC 检查是 GZIP 包装器的一部分,而不是 DEFLATE 格式的实际压缩数据的一部分。

    因此,您应该能够只获取压缩数据流的字节,忽略最后的 GZIP 标头和 CRC,然后通过 Inflater 传递它。

    换句话说,您只需要获取与GZIP File format specification 中称为“压缩块”的字节相对应的字节,并尝试使用Java Inflater 对象进行解压缩。需要做一些工作,但可能比 Greg 建议的重新编译 GZIP 代码要少(尽管他的选择原则上也可以)。

    【讨论】:

      猜你喜欢
      • 2016-04-05
      • 2015-07-21
      • 2021-09-15
      • 2014-01-06
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多