2013-05-14 43 views
0

这是一个特定于DEFLATE算法的问题,但涉及到gzip和zlib。从刷新点恢复DEFLATE解压缩

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

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

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

  1. 正确解压缩块和后续块
  2. 失败,出现“距离太远”错误

换句话说,我保证我永远不会以不良数据进行静默解压缩(我不是在讨论gzip结尾处的CRC32检查,而是zlib是否会大声抱怨)?

假设:

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

回答

1

如果Z_SYNC_FLUSH结果在随后的流,不给的距离太远的错误,那么,意外,相当于和无法区分Z_FULL_FLUSH。

我不希望这经常发生。

+0

谢谢。这是我怀疑的。 – DSnet 2013-05-14 04:02:50

+0

作为后续问题... 在我通过文件中途识别Z_SYNC_FLUSH点的情况下,如果我以某种方式确切地知道前面的32KiB未压缩数据是什么,我可以始终使用inflateSetDictionary()从该解压缩开始上? – DSnet 2013-05-16 04:58:24

+0

是的。 .......... – 2013-05-16 05:20:53