如何在Zip文件中找到中央目录的位置?

时间:2011-12-21 17:33:25

标签: zip format

我正在尝试在Zip文件中找到第一个中央目录文件头的位置。

我正在读这些: http://en.wikipedia.org/wiki/Zip_(file_formathttp://www.pkware.com/documents/casestudies/APPNOTE.TXT

在我看来,我只能扫描Zip数据,通过标题识别我所处的部分,然后执行此操作,直到我点击中央目录标题。我显然会在此之前阅读文件头并使用“压缩大小”来跳过实际数据,而不是循环遍历文件中的每个字节......

如果我这样做,那么我几乎已经知道Zip文件中的所有文件和文件夹,在这种情况下,我不再看到中央目录的用处。

据我所知,Central Directory的目的是列出文件元数据,以及Zip文件中实际数据的位置,这样您就不需要扫描整个文件了?

在阅读完中央目录记录后,维基百科说:

  

这种排序允许在一次传递中创建一个zip文件,但确实如此   通常通过首先读取中心目录来解压缩   端。

如何轻松找到中央目录结束记录?我们需要记住它可以有一个任意大小的注释,所以我可能不知道它所在的数据流末尾有多少字节。我只是扫描它吗?

P.S。我正在写一个Zip文件阅读器。

3 个答案:

答案 0 :(得分:8)

从最后开始并向开头扫描,查找目录签名的结尾并计算您扫描的字节数。找到候选项时,获取注释长度(L)的字节20偏移量。检查L + 20是否与您当前的计数相符。然后检查中心目录的开头(由字节12偏移指向)是否具有适当的签名。

如果您认为签名检查恰好是一个疯狂的猜测(例如,猜测着陆到数据段)时位是相当随机的,则使所有签名位正确的概率非常低。您可以对此进行优化,并找出在数据段中登陆的可能性以及击中合法标头的可能性(作为此类标头数量的函数),但这对我来说已经很低了。您可以通过检查列出的第一个文件记录的签名来提高您的置信度,但一定要处理空zip文件的边界情况。

答案 1 :(得分:1)

我最终从结尾开始循环遍历字节。如果找到匹配的字节序列,索引低于零或者它已经经过64k字节,则循环停止。

答案 2 :(得分:1)

只需交叉,希望没有CRC,时间戳或日期戳为06054B50的条目,或者恰好为06054B50的任何其他四个字节序列。