ZIP64文件格式分析

zip64 文件格式解析

引子:最近要预研zip包(>4G)差分还原, 能找得到的资源只有<4G的方案,>4G的zip包只好自己探索。以下内容系探索过程中关于zip64的记录,既是过往探索的总结,也希望对其他人有所帮助。
当你需要看zip64的相关解析,首先要看这篇博文: https://blog.csdn.net/qq_43278826/article/details/118436116。
这篇文章对于新手比较友好,图形解析胜过文字描述,回想我先看zip file format specification,简直云里雾里,当手册查询才是合理的阅读方式。

zip64文件描述图

请添加图片描述
结合上图以及我自己开发过程中真实数据对比描述,首先压缩包里的数据都是小端序, 0x04034b50在读取到数据时,表达方式是:0x50 0x4b 0x03 0x04, 以下所有数据都是如此排序, // 后面是便于理解的描述

Local File Header (0x04034b50)

zip压缩包中每一个子文件包括文件夹都有一个Local File Header

0x50 0x4b 0x03 0x04 // 子文件的头的标识

0x14 0x00 // 该子文件的解压版本,子文件<4G时,0x14

0x00 0x00 // bit 3置1,后面crc32, un/compress size置0,规格书如此*描述,实际读取来看uncompress size 未置0

0x08 0x00 // 压缩类型 inflate

0x97 0x03 // time
0x39 0x58 // date
0xbb 0x4c 0xc7 0x35 // crc,
0xd7 0xc2 0x09 0x00 // compress size, if > 4G,0xFFFF

0xd8 0x46 0x0e 0x00 // Uncompress size, if > 4G,0xFFFF

0x21 0x00 // 文件名长度

0x20 0x00 // 扩展内容长度,单个文件<4G的zip, 都是0x20

0x75 0x70 0x64 0x61 0x74 0x65 0x2f 0x47 0x4e 0x53 0x53 0x2f 0x4c 0x32 0x36 0x41 0x44 0x52 0x4e 0x52 0x31 0x32 0x41 0x30 0x32 0x5f 0x55 0x50 0x47 0x2e 0x62 0x69 0x6e // 文件名

0x55 0x54 0x0d 0x00 0x07 0x3f 0xab 0xb1 0x65 0x3e 0xab 0xb1 0x65 0x3f 0xab 0xb1 0x65 0x75 0x78 0x0b 0x00 0x01 0x04 0xee 0x03 0x00 0x00 0x04 0xf3 0x03 0x00 0x00 // 扩展内容,子文件<4G,没有上图深棕色部分的20个字节的内容

实际读取的数据后面都有data descriptor, 上图没有体现,实际上删除该部分,对zip包没有啥影响(子文件<4G,做的验证)

接下来就是子文件的压缩数据区了:

Central Directory File Header (0x02014b50)

在所有子文件结束后,就开始该区域;每个子文件都有一个对应的该区域,接下来重点描述其它文章中没有讲的细节 Local file Header 缩写 LFH
0x50 0x4b 0x01 0x02
0x14 0x03
0x2d 0x00 // zip解压时的版本,如果对应子文件位置偏移<4G, 该值是0x14, >4G则变成0x2d

0x00 0x00
0x08 0x00
0x97 0x03
0x39 0x58
0xbb 0x4c 0xc7 0x35
0xd7 0xc2 0x09 0x00
0xd8 0x46 0x0e 0x00
0x21 0x00
0x2c 0x00 // 对应子文件位置偏移<4G, 扩展长度:0x20, >4G 则是0x2C(子文件original size < 4G)

0x00 0x00
0x00 0x00
0x00 0x00
0x00 0x00 0xfd 0x81
0xff 0xff 0xff 0xff // 对应LFH在zip中的偏移值, if < 0xFFFFFFFF, 显示真实偏移值,如果 > 0xFFFFFF, 则在后面扩展区域的后面8byte区域展示

0x75 0x70 0x64 0x61 0x74 0x65 0x2f 0x47 0x4e 0x53 0x53 0x2f 0x4c 0x32 0x36 0x41 0x44 0x52 0x4e 0x52 0x31 0x32 0x41 0x30 0x32 0x5f
0x55 0x50 0x47 0x2e 0x62 0x69 0x6e 0x55 0x54 0x0d 0x00 0x07 0x3f 0xab 0xb1 0x65 0x3e 0xab 0xb1 0x65 0x3f 0xab 0xb1 0x65 0x75 0x78 0x0b 0x00 0x01 0x04 0xee 0x03 0x00 0x00 0x04 0xf3 0x03 0x00 0x00
0x01 0x00 // ZIP64的扩展ID

0x08 0x00 // 接下来占据的字节数
0xe8 0xec 0xe3 0x0e 0x01 0x00 0x00 0x00 // 对应LFH在zip中的偏移值

对于0x01 0x00 zip64的扩展ID后面的内容,图片显示有压缩大小(8byte),原始大小(8byte), 偏移值(8byte) ,实际读取时发现,只有偏移值,长度也只有8byte,猜测可能由于子文件<4G,因此不添加进来 ;
上图显示扩展内容后面还有注释长度,由于我实际读取数据中,该值为0,就没有体现该段内容

ZIP64 End of Central Directory Record (0x06064b50)

该区域是>4G的zip文件特有,<4G 没有该区域

0x50 0x4b 0x06 0x06
0x2c 0x00 0x00 0x00 0x00 0x00 0x00 0x00 // 该值+12 == 该区域的byte数

0x2d 0x00
0x2d 0x00
0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00
0x1b 0x00 0x00 0x00 0x00 0x00 0x00 0x00 // 子文件个数,包括文件夹

0x1b 0x00 0x00 0x00 0x00 0x00 0x00 0x00 // 子文件个数,包括文件夹

0xb2 0x0a 0x00 0x00 0x00 0x00 0x00 0x00 // 所有0x02014b50总共长度

0x1e 0xb0 0xed 0x0e 0x01 0x00 0x00 0x00 // 第一个0x02014b50在文件中的位置偏移

ZIP64 End of Central Directory Locator (0x07064b50)

该区域是>4G的zip文件特有,<4G 没有该区域

0x50 0x4b 0x06 0x07
0x00 0x00 0x00 0x00
0x78 0xbe 0xed 0x0e 0x01 0x00 0x00 0x00 // zip64 ECDR 0x06064b50在文件中的偏移位置

0x01 0x00 0x00 0x00

End of Central Directory Record (0x06054b50)

所有zip都有
0x50 0x4b 0x05 0x06
0x00 0x00
0x00 0x00
0x1e 0x00
0x1e 0x00
0xd2 0x0b 0x00 0x00
0xff 0xff 0xff 0xff // 第一个0x02014b50在文件中的偏移值,if > 4G, 设置0xFFFFFFFF,具体值在0x06064b50区域

0x00 0x00

以上是我结合具体zip包和网上搜索到的资料的一个大致解析过程,当然,zip规格文档中还有许多其它区域描述,由于我目前并没有涉及到,就不瞎写了。

  • 34
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GDAL(Geospatial Data Abstraction Library)是一个开源的地理空间数据处理库,它可以读取多种格式的地理空间数据。在处理地理空间数据时,有时候我们会遇到压缩的文件,如zip文件。下面我将简要介绍如何使用GDAL来读取zip压缩文件。 首先,我们需要确保已经安装了GDAL库和相应的依赖项。可以从GDAL的官方网站或其他可靠的资源中获取并安装GDAL。 一旦GDAL已经安装并配置好,我们可以使用GDAL提供的相关API来读取zip压缩文件中的地理空间数据。以下是实现这一过程的步骤: 1. 导入所需的GDAL模块,例如`import osgeo.gdal`。 2. 使用`gdal.Open`函数打开zip压缩文件。该函数的参数应为zip文件的路径。 3. 调用`GetSubDatasets`函数获取zip压缩文件中的子数据集。这些子数据集是压缩文件中存储的不同地理空间数据集。 4. 通过循环遍历这些子数据集,并使用`gdal.Open`函数打开每个子数据集。 5. 可以使用GDAL提供的各种函数和方法来处理打开的地理空间数据集,如读取和写入数据、获取元数据等。 需要注意的是,由于zip压缩文件可以包含多个不同格式的地理空间数据,因此在读取zip压缩文件中的地理空间数据前,我们需要了解其中所包含的数据格式,并根据需要选择合适的API和函数来读取和处理。 总结起来,通过使用GDAL库及其相应的API,我们可以方便地读取zip压缩文件中的地理空间数据,并进行后续处理和分析。这大大方便了地理空间数据的处理和利用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值