如何在zip文件中找到"中央目录"的开头?

Bil*_*eal 25 zip file-format

维基百科对ZIP文件格式有很好的描述,但"中心目录"结构让我感到困惑.特别是这个:

这种排序允许在一次传递中创建ZIP文件,但通常通过首先读取最后的中心目录来解压缩.

问题是即使中央目录的尾部标题也是可变长度.那么,有人可以得到解析中心目录的开头吗?

(哦,我确实花了一些时间看着APPNOTE.TXT,然后来到这里询问:P)

sar*_*old 15

我的哀悼,阅读维基百科的描述给了我非常强烈的印象,你需要做相当多的猜测+检查工作:

从0x06054b50目录结束标记的末尾向后搜索,向前看16个字节以找到目标开始标记0x02014b50的偏移量,并希望是它.您可以进行一些健全性检查,例如在目录结束标记之后查找注释长度和注释字符串标记,但它确实感觉Zip解码器有效,因为人们不会将有趣的字符放入其zip注释,文件名等等向前.完全基于维基百科页面,无论如何.

  • 我希望没有人在评论部分使用"0x06054b50":P (5认同)
  • 如果存在这样的标头签名,那就更容易了,但它会使将 ZIP 附加到另一个文件(例如可执行文件)变得不可能,这是 ZIP 存档的一个非常有用的功能。 (2认同)

Nic*_*sky 7

我前段时间正在实现zip存档支持,我搜索最后几千字节的中央目录签名结束(4个字节).这非常有效,直到有人将50kb文本放入评论中(这不太可能发生.绝对肯定,你可以搜索最后64kb +几个字节,因为评论大小是16位).之后,我查找中央目录定位器的zip64端,由于它具有固定的结构,因此更容易.