zip相关知识梳理(一)

经过对zip文件的长时间研究,对zip文件进行相关知识进行梳理,虽然网上很多牛人对其做了相关基础解析,但是对于特殊情况没有进行说明,比如超过4G的zip文件该以什么格式进行编译,现本人对其进行详细讲解。如有不足,欢迎各位大神指点!

一、zip文件格式

zip文件格式:
[本地文件头1]
[文件数据1]
[数据描述符1]
.
.
.
[本地文件头n]
[文件数据n]
[数据描述符n]
[存档解密标题](EFS)
[存档额外数据记录](EFS)
[核心目录]
[zip64中心目录记录结束]
[中央目录定位器的zip64端]
[中央目录记录结束]

因此压缩源文件数据区包括三个部分:[本地文件头] + [档案数据] + [数据描述符]

1.本地头文件

用于标识该文件的开始,记录了该压缩文件的信息。

Offset Bytes description
0 4 文件头标识,固定值(0x04034b50)
4 2 解压文件所需的pkware最低版本
6 2 通用比特标志位
8 2 压缩方式
10 2 文件最后修改时间
12 2 文件最后修改日期
14 4 CRC-32校验码
18 4 压缩后的大小
22 4 未压缩的大小
26 2 文件名长度
28 2 扩展区长度
30 n 文件名
30+n m 扩展区

其中通用标志位具体参数获取如下:

Bytes description
0 如果设置,表示文件已加密
2 1

0 0 正常压缩方式

0 1 最大压缩方式

1 0 快速压缩方式

1 1 最快压缩方式

3 如果设置此位,CRC-32与未压缩大小在头文件中设为0,正常值放到数据描述符中
4 位方法8保留,为了增强压缩
5 如果置位,表示该文件为压缩的补充数据
6 如果置位,则提取值所需的版本设置为至少
50,并需要结合位0,提取值所需的版本必须
至少为51
7 目前未使用
8 目前未使用
9 目前未使用
10 目前未使用
11 目前未使用
12 由PKWARE保留以增强压缩
13 在加密中央目录时使用,以指示本地标题中的选定数据值被屏蔽以隐藏其实际值
14 由PKWARE保留
15 由PKWARE保留

###2.文件数据
记录压缩后文件的数据
###3.数据描述符
用于标识该文件压缩结束,该结构只有在相应的local file header中通用标记字段的第3bit设为1时才会出现,紧接在压缩文件源数据后。这个数据描述符只用在不能对输出的 ZIP 文件进行检索时使用。

Offset Bytes description
0 4 CRC-32校验码
4 4 压缩后的大小
8 4 未压缩的大小

###4.核心目录
录了压缩文件的目录信息,在这个数据区中每一条纪录对应在压缩源文件数据区中的一条数据。

Offset Bytes description
0 4 核心目录标识,固定值(0x02014b50)
4 2 解压文件所需的pkware最低版本
6 2 解压所需pkware版本
8 2 通用位标志
10 2 压缩方法
12 2 文件最后修改时间
14 2 文件最后修改日期
16 4 CRC-32校验码
20 4 压缩后的大小
24 4 未压缩的大小
28 2 文件名长度
30 2 扩展域长度
32 2 文件注释长度
34 2 文件开始位置的磁盘编码
36 2 内部文件属性
38 4 外部文件属性
42 4 本地文件头的相对位移
46 n 目录文件名
46+n m 扩展域
46+n+m k 文件注释内容

###5.目录结束标识
目录结束标识存在于整个归档包的结尾,用于标记压缩的目录数据的结束。每个压缩文件必须有且只有一个EOCD记录。

Offset Bytes description
0 4 核心目录结束标记(0x06054b50)
4 2 当前磁盘编码
6 2 核心目录开始位置的磁盘编号
8 2 该磁盘上所记录的核心目录数量
10 2 核心目录结构总数
12 4 核心目录的大小
16 4 核心目录开始位置相对于archive开始的位移
20 2 注释长度
22 n 注释内容

###6.zip64核心目录结束记录符(4G以上zip文件会用到)

Offset Bytes description
0 4 zip64核心目录结束标志,固定值(0x06064b50)
4 8 核心目录的大小
12 2 版本标识
14 2 版本
16 4 磁盘编码
20 4 核心目录的开始的磁盘编码
24 8 zip中压缩文件的数目
32 8 zip中整个文件的数目
40 8 核心目录的总条数
48 8 核心目录相对于磁盘开始的偏移

###7.zip64核心目录定位结束符(4G以上zip文件会用到)

Offset Bytes description
0 4 zip64核心目录定位结束符标志位,固定值(0x07064b50)
4 4 核心目录开始的磁盘编号
8 8 核心目录末端的相对偏移
16 4 磁盘总数

最新文章

  1. 跨域的jsonP
  2. 【原】iOS学习47之第三方-FMDB
  3. Linux系统性能分析
  4. winform(无边框窗体与timer)
  5. 用HTML代码加载Unity内容
  6. EIGRP默认路由分发的四种方法
  7. Nico Game Studio 3.地图纹理编辑 物体皮肤编辑
  8. MySQL单列索引和组合索引的区别介绍
  9. PAT (Advanced Level) 1055. The World's Richest (25)
  10. Debian 8开启sftp服务
  11. BOM中的各种height
  12. [bzoj1223] [HNOI2002]Kathy函数
  13. 重拾Python(3):Pandas之Series对象的使用
  14. Vue2学习(2)
  15. yii2实战之初见端倪
  16. [UE4]RichTextBlock
  17. 洛谷P3041 视频游戏的连击Video Game Combos [USACO12JAN] AC自动机+dp
  18. vim-程序员的利器
  19. 分析ReentrantLock的实现原理
  20. Android ListView的item背景色设置

热门文章

  1. Vijos 1144 小胖守皇宫 【树形DP】
  2. 在java中除去字符串(String)中的换行字符(\r \n \t)
  3. 蓝书2.4 AC自动机
  4. BZOJ_3133_[Baltic2013]ballmachine_堆+倍增
  5. Chapter 4 Syntax Analysis
  6. 为什么要用Go语言做后端
  7. [转]C++常用字符串分割方法实例汇总
  8. GIT学习之路第三天 文件操作
  9. Android 性能优化(16)线程优化:Creating a Manager for Multiple Threads 如何创建一个线程池管理类
  10. Python---查看安装路径