从刷新点恢复DEFLATE减压

时间:2013-05-14 01:51:20

标签: zlib flush compression deflate

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

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

我知道我可以在Z_FULL_FLUSH点恢复解压缩,因为解压缩所需的所有信息都可用(IE:字典被重置)。但是,如果我尝试从Z_SYNC_FLUSH解压缩,我通常得到一个“zlib.error:解压缩错误-3:无效距离太远”错误。

问题是:如果我尝试从Z_SYNC_FLUSH点解压缩,我保证要么:

  1. 正确解压缩该块和后续块
  2. “距离太远”错误
  3. 换句话说,我保证我永远不会用坏数据静默解压缩(我不是在讨论gzip末尾的CRC32检查,而是zlib是否会大声抱怨)?

    假设:

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

1 个答案:

答案 0 :(得分:1)

如果Z_SYNC_FLUSH导致后续流没有给出远距离太远的错误,那么它偶然会与Z_FULL_FLUSH相等并且无法区分。

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