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点解,我保证可以之一:
- 正确解压缩块和后续块
- 失败,出现“距离太远”错误
换句话说,我保证我永远不会以不良数据进行静默解压缩(我不是在讨论gzip结尾处的CRC32检查,而是zlib是否会大声抱怨)?
假设:
- 假设我能够完全识别刷新点。让我们假装我不会将随机比特识别为同步标记,也不会将模式恰好出现在类型0块中。这是不现实的,但只是假设它是真实的。
- 假设文件永远不会损坏,并且始终是合法的gzip文件。
谢谢。这是我怀疑的。 – DSnet 2013-05-14 04:02:50
作为后续问题... 在我通过文件中途识别Z_SYNC_FLUSH点的情况下,如果我以某种方式确切地知道前面的32KiB未压缩数据是什么,我可以始终使用inflateSetDictionary()从该解压缩开始上? – DSnet 2013-05-16 04:58:24
是的。 .......... – 2013-05-16 05:20:53