我试图找到 Zip 文件中第一个中央目录文件头的位置。
我正在读这些:http://en.wikipedia.org/wiki/Zip_(文件格式)
http://www.pkware.com/documents/casestudies/APPNOTE.TXT
在我看来,我只能扫描 Zip 数据,通过标头识别我所在的部分,然后执行此操作,直到找到中央目录标头。显然,我会在此之前阅读文件头并使用“压缩大小”来跳过实际数据,而不是循环遍历文件中的每个字节......
如果我这样做,那么我实际上已经知道 Zip 文件内的所有文件和文件夹,在这种情况下,我认为中央目录不再有太大用处。
据我了解,中央目录的目的是列出文件元数据以及 Zip 文件中实际数据的位置,这样您就不需要扫描整个文件?
在阅读完中央目录记录结束后,维基百科说:
此顺序允许一次性创建 zip 文件,但它是
通常通过首先读取中央目录来解压缩
结尾。
如何轻松找到中央目录记录结束?我们需要记住,它可以有任意大小的注释,所以我可能不知道它位于数据流末尾有多少字节。我只要扫描就可以了吗?
附:我正在编写一个 Zip 文件阅读器。
从末尾开始向开头扫描,查找目录签名的末尾并计算已扫描的字节数。当您找到候选者时,获取注释长度 (L) 的字节 20 偏移量。检查 L + 20 是否与您当前的计数匹配。然后检查中央目录的开头(由字节 12 偏移量指向)是否具有适当的签名。
如果您假设当签名检查碰巧是一个疯狂的猜测时这些位是相当随机的(例如,猜测落在数据段中),那么使所有签名位正确的概率非常低。您可以对其进行改进,并计算出进入数据段的机会以及命中合法标头的机会(作为此类标头数量的函数),但对我来说,这听起来可能性很小。您可以通过检查列出的第一个文件记录的签名来提高置信度,但请务必处理空 zip 文件的边界情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)