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

Tow*_*wer 10 format zip

我试图在Zip文件中找到第一个中央目录文件头的位置.

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

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

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

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

在阅读了关于中央目录结束记录之后,维基百科说:

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

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

PS我正在写一个Zip文件阅读器.

Der*_*k E 9

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

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

  • 还应该提到的是,最好从“endOfFile - 22”位置开始,因为中央目录签名的真正结束不能发生在该位置之后。对于带有空注释的档案,这将在第一次迭代时找到签名。 (2认同)

Tow*_*wer 1

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