我试图在Zip文件中找到第一个中央目录文件头的位置.
我正在读这些:http: //en.wikipedia.org/wiki/Zip_(file_format) http://www.pkware.com/documents/casestudies/APPNOTE.TXT
在我看来,我只能扫描Zip数据,通过标题识别我所在的部分,然后执行此操作,直到我点击中央目录标题.我显然会在此之前阅读文件头并使用"压缩大小"来跳过实际数据,而不是循环遍历文件中的每个字节...
如果我这样做,那么我几乎已经知道Zip文件中的所有文件和文件夹,在这种情况下我不再看到中央目录的用处.
据我所知,中央目录的目的是列出文件元数据,以及Zip文件中实际数据的位置,这样您就不需要扫描整个文件了?
在阅读了关于中央目录结束记录之后,维基百科说:
这种排序允许在一次传递中创建一个zip文件,但通常通过首先读取最后的中心目录来解压缩.
如何轻松找到中央目录结束记录?我们需要记住它可以有一个任意大小的注释,所以我可能不知道它所在的数据流末尾有多少字节.我只是扫描一下吗?
PS我正在写一个Zip文件阅读器.
从最后开始并向开始扫描,查找目录签名的结尾并计算您扫描的字节数.找到候选项时,获取注释长度(L)的字节20偏移量.检查L + 20是否与您当前的计数相符.然后检查中心目录的开头(由字节12偏移指向)是否具有适当的签名.
如果你认为当签名检查恰好是一个疯狂的猜测(例如,猜测着陆到数据段)时,这些位是相当随机的,那么使所有签名位正确的概率非常低.您可以对此进行优化,并找出在数据段中登陆的可能性以及击中合法标头的可能性(作为此类标头数量的函数),但这对我来说已经很低了.您可以通过检查列出的第一个文件记录的签名来提高置信度,但一定要处理空zip文件的边界情况.