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

2023-11-26

我试图找到 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(使用前将#替换为@)

如何查找 Zip 文件中中央目录的位置? 的相关文章

随机推荐

  • Big O 正式定义中的常量

    我正在修改 Big O 和其他相关界限的正式定义 但有些事情让我绊倒了 在我正在读的书中 Skiena Big O 被定义为 f n O g n 当存在常数 c 时 对于 n gt n0 的某个值 f n 始终 这对我来说通常是有意义的 我
  • UITextField 自定义背景视图和移动文本

    我正在尝试使用自定义文本字段背景 问题是文本看起来离 左侧太近 我没有看到任何方法可以在不子类化 UITextField 的情况下移动文本 所以我试图扩展和覆盖 void drawTextInRect CGRect rect NSLog d
  • 在客户端 JavaScript 中访问 Express.js 局部变量

    很好奇我是否做得对 如果不对 你们会如何处理这个问题 我有一个 Jade 模板 需要渲染从 MongoDB 数据库检索的一些数据 并且我还需要访问客户端 JavaScript 文件中的数据 我正在使用 Express js 并将数据发送到
  • Swift:在 IOS13+ 上设置 StatusBar 颜色(使用 statusBarManager)

    我想通过代码定义状态栏的颜色 我发现它是这样的 但它已被弃用 有谁知道这样做的新方法是什么 这个警告在我的所有代码中都跟着我 此代码有效 但有警告 任何想要的人的代码 class AppDelegate UIResponder UIAppl
  • 从另一个类调用方法

    我想知道如何从另一个类调用方法 而不必创建该类的新实例 我查过这个 我看到的 90 的示例都要求我为我引用的类制作一个新副本 像这样的东西 Fooclass test new Fooclass test CallMethod 但是 我想知道
  • 如何在xgboost中获得每棵树的预测?

    使用xgboost Booster predict只能得到所有树的预测结果或者每棵树的预测叶子 但是我怎样才能得到每棵树的预测值呢 截至最近 xgboost引入了切片 API Raul 的答案虽然有效 但过于复杂 要获得单独的预测 您所需要
  • 将 JavaScript 数组的键和值获取到变量中

    我有一个 JavaScript 对象数组 写的时候console log myarry 它将以下面的形式显示在控制台中 Array 2 0 Object one one 1 Object two two length 2 在这个数组中 我的
  • Objective-c:将日期字符串转换为星期几+月份名称

    初学者的问题 但我想知道是否有人可以帮助我解决这个问题 我需要根据包含特定日期的字符串设置四个字符串 例如 Apr 7 2011 表示星期几的字符串 缩写 Mon Tue Wed Thu Fri Sat Sun 例如 Thu 需要一天的字符
  • 如何确定一个对象是否可以 ToString 转换为值或类型名称?

    我正在编写 php 服务和我们的 crm 之间的互操作 我需要做的一件事是确保简单类型被转换为 ToString 以便稍后在 json 转换器中使用 我什至不确定 简单类型 的名称是什么 但它可以这样定义 代表低级变量类型的对象 包含单个值
  • Promise 和通用 .catch() 语句

    我正在为我的系统编写一个 API 它将 XHR 发送到服务器并返回一个应由调用者处理的承诺 到目前为止一切顺利 对于每个 API 调用 我必须使用 then and catch调用 但通常 大约 75 的时间 catch引用相同的功能 只需
  • CRC16 校验和:HCS08 与 Kermit 与 XMODEM

    我正在尝试将 CRC16 错误检测添加到 Motorola HCS08 微控制器应用程序 但我的校验和不匹配 一在线CRC计算器提供了我在 PC 程序中看到的结果和我在微型计算机上看到的结果 它将微处理器的结果称为 XModem 将 PC
  • SQL Server 为 xml 路径添加属性和值

    我想创建一个包含属性和值的 xml 节点 Example
  • 我如何编写Applescript来每小时弹出警报[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想知道如何每小时在我的计算机 Mac OS X 上弹出一个警报 我认为用 Applescript 写这个会非常简单 但我没有 Applescript 经验 谢谢 AppleSc
  • 为什么“显示:表格单元格”在“位置:绝对”时被破坏

    我遇到了一个奇怪的问题 我使用DIV作为容器 并将图像放入该DIV中 我希望该图像与底部垂直对齐 以下代码有效 banner width 700px height 90px top 60px left 178px overflow hidd
  • 如何使用存储库模式和实体框架连接多个表?

    我需要使用存储库模式和实体框架 使用 C 连接多个表 这可能吗 如果是这样 请让我知道如何做同样的事情 在 EF 中 连接表是通过使用导航属性完成的 基本上 EF 会为您做到这一点 在您的存储库中实现时 无论它是否是通用的 您都可以调用In
  • 没有名为“系统”的模块

    我有一个问题已经在一些 GitHub 博客中讨论过 但那里的答案非常令人困惑和复杂 所以我也想在这里问一下 在提问之前 我想说我不是一个专业的程序员 所以如果我的问题很简单 我深表歉意 我最近不得不安装Python 3 7 我曾经有像 cl
  • SQL 查询仅选择孙子

    我对 SQL 还很陌生 试图理解它 但它变得有点令人困惑 这是我正在使用的内容的简化版本 我有这张桌子叫people id name parent id 1 Bob 3 2 John 5 3 Larry 4 4 Kevin 0 5 Kyle
  • Facebook PHP SDK 抛出无法捕获的 OAuthException

    我尝试向 Facebook Graph API 发布开放图操作 但收到 OAuth 异常 3501 User is already associated to the 一切都很好 我希望 Facebook 能够抛出这个异常 我在验证用户身份
  • 为什么从jndi.properties注入后在JNDI中找不到数据源?

    这是我的persistence xml
  • 如何查找 Zip 文件中中央目录的位置?

    我试图找到 Zip 文件中第一个中央目录文件头的位置 我正在读这些 http en wikipedia org wiki Zip 文件格式 http www pkware com documents casestudies APPNOTE