1

这是一个特定于 DEFLATE 算法的问题,但与 gzip 和 zlib 有关。

假设我有一个 gzip 文件,我知道文件中有几个刷新点。其中一些是用 Z_SYNC_FLUSH 和其他 Z_FULL_FLUSH 制作的。如果我扫描文件,我可以找到所有的刷新点,因为它们立即遵循 0000ffff 的模式。

我知道我可以在 Z_FULL_FLUSH 点恢复解压,因为解压所需的所有信息都可用(即:字典已重置)。但是,如果我尝试从 Z_SYNC_FLUSH 解压缩,我通常会收到“zlib.error: Error -3 while decompressing: invalid distance too far back”错误。

问题是这样的:如果我尝试从 Z_SYNC_FLUSH 点解压缩,我是否可以保证:

  1. 正确解压缩该块和后续块
  2. 因“距离太远”错误而失败

换句话说,我是否保证我永远不会用坏数据静默解压(我不是在谈论 gzip 末尾的 CRC32 检查,而是 zlib 是否会大声抱怨)?

假设:

  1. 假设我能够完美地识别冲洗点。让我们假设我没有错误地将随机位识别为同步标记,也没有将模式恰好出现在类型 0 块中。这是不现实的,但只是假设它是真的。
  2. 假设文件从未损坏并且始终是合法的 gzip 文件。
4

1 回答 1

1

如果 Z_SYNC_FLUSH 导致后续流没有给出距离太远错误,那么它意外地等同于 Z_FULL_FLUSH 并且无法区分。

我不希望这种情况经常发生。

于 2013-05-14T03:57:28.137 回答