这是一个特定于 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 点解压缩,我是否可以保证:
- 正确解压缩该块和后续块
- 因“距离太远”错误而失败
换句话说,我是否保证我永远不会用坏数据静默解压(我不是在谈论 gzip 末尾的 CRC32 检查,而是 zlib 是否会大声抱怨)?
假设:
- 假设我能够完美地识别冲洗点。让我们假设我没有错误地将随机位识别为同步标记,也没有将模式恰好出现在类型 0 块中。这是不现实的,但只是假设它是真的。
- 假设文件从未损坏并且始终是合法的 gzip 文件。