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