说明 - zip格式说明
- zip 官方文档 -
该文参考了关于官方在 2004.04.26 发布的 6.2.0 版本的zip格式(地址:https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.2.0.txt)
- 摘录 -
Overall .ZIP file format:
1 | Overall .ZIP file format: |
对应的指代分别为:
1 | [local file header 1] -> 文件标头 |
其中,[local file header],[file data] 以及 [data descriptor] 都是可以重复多次的(理论上说每压缩一个文件,这 3个 片段都会重复一遍)。
而在咱们的操作系统上,一个简单的 .zip 格式实际上为 [local file header] + [file data] + [data descriptor] + [central directory] + [end of central directroy record],对没错就是这些:
-
文件标头
-
文件数据
-
数据描述符(于标识该文件压缩结束,该结构只有在相应的header中通用标记字段的第3位设为1时才会出现,紧接在压缩文件源数据后。这个数据描述符只用在不能对输出的 ZIP 文件进行检索时使用。例如:在一个不能检索的驱动器(如:磁带机上)上的 ZIP 文件中。如果是磁盘上的ZIP文件一般没有这个数据描述符。)
-
中心目录
-
中心目录记录结尾
然后现在来简单的说一下这四个格式呗。
- 简单的 .zip 格式 -
- [local file header] -
文件标头格式:
1 | Local file header: |
对应表格:
Offset | Bytes | Description | 译 |
---|---|---|---|
0 | 4 | Local file header signature = 0x04034b50 (read as a little-endian number) | 文件头标识,值固定(0x04034b50) |
4 | 2 | Version needed to extract (minimum) | 解压文件所需 pkware 最低版本 |
6 | 2 | General purpose bit flag | 通用比特标志位(置比特0位=加密,详情见后) |
8 | 2 | Compression method | 压缩方式 |
10 | 2 | File last modification time | 文件最后修改时间 |
12 | 2 | File last modification date | 文件最后修改日期 |
14 | 4 | CRC-32 | CRC-32校验码 |
18 | 4 | Compressed size | 压缩后的大小 |
22 | 4 | Uncompressed size | 压缩前的大小 |
26 | 2 | File name length (n) | 文件名长度 |
28 | 2 | Extra field length (m) | 扩展区长度 |
30 | n | File name | 文件名 |
30+n | m | Extra field | 扩展区 |
- [file data] -
文件数据格式:
1 | Immediately following the local header for a file |
- [data descriptor] -
数据描述符格式:
1 | data descriptor: |
对应表格:
Offset | Bytes | Description | 译 |
---|---|---|---|
0 | 4 | crc-32 | CRC-32校验码 |
4 | 4 | compressed size | 压缩后的大小 |
8 | 4 | uncompressed size | 压缩前的大小 |
- [central directory] -
中心目录格式:
1 | Central directory structure: |
对应表格:
Offset | Bytes | Description | 译 |
---|---|---|---|
0 | 4 | Central directory file header signature = 0x02014b50 | 中心目录文件header标识 = (0x02014b50) |
4 | 2 | Version made by | 压缩所用的 pkware 版本 |
6 | 2 | Version needed to extract (minimum) | 解压所需 pkware 的最低版本 |
8 | 2 | General purpose bit flag | 通用位标记 |
10 | 2 | Compression method | 压缩方法 |
12 | 2 | File last modification time | 文件最后修改时间 |
14 | 2 | File last modification date | 文件最后修改日期 |
16 | 2 | CRC-32 | CRC-32校验码 |
20 | 4 | Compressed size | 压缩后的大小 |
24 | 4 | Uncompressed size | 压缩前的大小 |
28 | 4 | File name length (n) | 文件名长度 |
30 | 2 | Extra field length (m) | 扩展区长度 |
32 | 2 | File comment length (k) | 文件注释长度 |
34 | 2 | Disk number where file starts | 文件开始位置的磁盘编号 |
36 | 2 | Internal file attributes | 内部文件属性 |
38 | 2 | External file attributes | 外部文件属性 |
42 | 4 | relative offset of local header | 本地文件标头即是[local file header]相对偏移量 |
46 | n | File name | 目录文件名 |
46+n | m | Extra field | 扩展区 |
46+n+m | k | File comment | 文件注释内容 |
- [end of central directroy record] -
中心目录记录结尾格式:
1 | End of central directory record: |
对应表格:
Offset | Bytes | Description | 译 |
---|---|---|---|
0 | 4 | End of central directory signature = 0x06054b50 | 中心目录结束标记 = (0x06054b50) |
4 | 2 | Number of this disk | 当前磁盘编号 |
6 | 2 | number of the disk with the start of the central directory | 中心目录开始位置的磁盘编号 |
8 | 2 | total number of entries in the central directory on this disk | 该磁盘上所记录的中心目录数量 |
10 | 2 | total number of entries in the central directory | 中心目录结构总数 |
12 | 4 | Size of central directory (bytes) | 中心目录的大小 |
16 | 4 | offset of start of central directory with respect to the starting disk number | 中心目录起始位置相对于起始磁盘号的偏移量 |
20 | 2 | .ZIP file comment length(n) | 注释长度 |
22 | n | .ZIP Comment | 注释内容 |
(表格摘自:https://blog.csdn.net/a200710716/article/details/51644421)
- 简单的实例 -
压缩 yyds.txt
以及 trytry.txt
(未加密):
文件内容如下图:
将这两个文件压缩好了,然后使用 010 edior 来查看,得到如下图:
那么,用简单的表格来分析一下:
Offset | Start | End | Bytes | Content | Description |
---|---|---|---|---|---|
Local File Header | |||||
LOCAL FILE HEADER 1 | |||||
0000h | 0000h | 0004h | 4 | 50 4B 03 04 | (trytry.txt) 文件标头 |
0004h | 0005h | 0006h | 2 | 14 00 | 解压文件所需 pkware 最低版本 |
0006h | 0007h | 0008h | 2 | 00 00 | 通用位标记符 |
0008h | 0009h | 000Ah | 2 | 08 00 | 压缩方式 |
000Ah | 000Bh | 000Ch | 2 | 3C 67 | 文件最后修改时间 |
000Ch | 000Dh | 000Eh | 2 | 9A 51 | 文件最后修改日期 |
000Eh | 000Fh | 0012h | 4 | 6C 84 7D BE | crc-32校验码 |
0012h | 0013h | 0016h | 4 | 06 00 00 00 | 压缩后的大小 |
0016h | 0017h | 001Ah | 4 | 09 00 00 00 | 压缩前的大小 |
001Ah | 001Bh | 001Ch | 2 | 0A 00 | 文件名长度 |
001Ch | 001Dh | 001Eh | 2 | 00 00 | 扩展区长度 |
001Eh | 001Fh | 0027h | 10 | 74 72 79 74 72 79 2E 74 78 74 | 文件名内容 |
0027h | 0027h | 0027h | 0 | Null | 扩展区内容 |
FILE DATA 1 | |||||
0027h | 0028h | 002Dh | 6 | 2B 29 AA 84 20 00 | (trytry.txt) 文件数据 |
DATA DESCRIPTOR 1 | |||||
002Dh | 002Dh | 002Dh | 0 | Null | (trytry.txt) 数据描述符 |
LOCAL FILE HEADER 2 | |||||
002Eh | 002Eh | 0031h | 4 | 50 4B 03 04 | (yyds.txt) 文件标头 |
0031h | 0032h | 0033h | 2 | 14 00 | 解压文件所需 pkware 的最低版本 |
0033h | 0034h | 0035h | 2 | 00 00 | 通用位标记符 |
0035h | 0036h | 0037h | 2 | 08 00 | 压缩方式 |
0037h | 0038h | 0039h | 2 | 37 67 | 文件最后修改时间 |
0039h | 003Ah | 003Bh | 2 | 9A 51 | 文件最后修改日期 |
003Ch | 003Ch | 003Fh | 4 | D3 4F 70 57 | crc-32校验码 |
003Fh | 0040h | 0043h | 4 | 0A 00 00 00 | 压缩后的大小 |
0043h | 0044h | 0047h | 4 | 16 00 00 00 | 压缩前的大小 |
0047h | 0048h | 0049h | 2 | 08 00 | 文件名长度 |
0049h | 004Ah | 004Bh | 2 | 00 00 | 扩展区长度 |
004Bh | 004Ch | 0053h | 8 | 79 79 64 73 2E 74 78 74 | 文件名内容 |
0053h | 0053h | 0053h | 0 | Null | 扩展区内容 |
FILE DATA 2 | |||||
0053h | 0054h | 005Dh | 10 | CB 48 84 42 30 51 91 09 81 00 | (yyds.txt) 文件数据 |
DATA DESCRIPTOR 2 | |||||
005Dh | 005Dh | 005Dh | 0 | Null | (yyds.txt) 数据描述符 |
Central Directory Header | |||||
FILE HEADER 1 | |||||
005Eh | 005Eh | 0061h | 4 | 50 4B 01 02 | (trytry.txt) 中心目录文件标头 |
0061h | 0062h | 0063h | 2 | 3F 00 | 压缩所用的 pkware 版本 |
0063h | 0064h | 0065h | 2 | 14 00 | 解压所需 pkware 的最低版本 |
0065h | 0066h | 0067h | 2 | 00 00 | 通用位标记 |
0067h | 0068h | 0069h | 2 | 08 00 | 压缩方法 |
0069h | 006Ah | 006Bh | 2 | 3C 67 | 文件最后修改时间 |
006Bh | 006Ch | 006Dh | 2 | 9A 51 | 文件最后修改日期 |
006Dh | 006Eh | 0072h | 4 | 6C 84 7D BE | crc-32校验码 |
0072h | 0073h | 0075h | 4 | 06 00 00 00 | 压缩后的大小 |
0075h | 0076h | 0079h | 4 | 09 00 00 00 | 压缩前的大小 |
0079h | 007Ah | 007Bh | 2 | 0A 00 | 文件名长度 |
007Bh | 007Ch | 007Dh | 2 | 24 00 | 扩展区长度 |
007Dh | 007Eh | 007Fh | 2 | 00 00 | 文件注释长度 |
007Fh | 0080h | 0081h | 2 | 00 00 | 文件开始位置的磁盘编号 |
0081h | 0082h | 0083h | 2 | 00 00 | 内部文件属性 |
0083h | 0084h | 0087h | 4 | 20 00 00 00 | 外部文件属性 |
0087h | 0088h | 008Bh | 4 | 00 00 00 00 | 本地文件标头即是 [LOCAL FILE HEADER 1] 相对偏移量(offset值) |
008Bh | 008Ch | 0095h | 10 | 74 72 79 74 72 79 2E 74 78 74 | 文件名内容 |
0095h | 0096h | 00B9h | 36 | 0A 00 20 00 00 00 00 00 01 00 18 00 02 E7 7A AC 43 DB D6 01 16 37 CE AC 43 DB D6 01 91 A8 31 A8 43 DB D6 01 | 扩展区内容 |
00B9h | 00B9h | 00B9h | 0 | Null | 文件注释内容 |
FILE HEADER 2 | |||||
00BAh | 00BAh | 00BDh | 4 | 50 4B 01 02 | (yyds.txt) 中心目录文件标头 |
00BDh | 00BEh | 00BFh | 2 | 3F 00 | 压缩所用的 pkware 版本 |
00BFh | 00C0h | 00C1h | 2 | 14 00 | 解压所需 pkware 的最低版本 |
00C1h | 00C2h | 00C3h | 2 | 00 00 | 通用位标记 |
00C3h | 00C4h | 00C5h | 2 | 08 00 | 压缩方法 |
00C5h | 00C6h | 00C7h | 2 | 37 67 | 文件最后修改时间 |
00C7h | 00C8h | 00C9h | 2 | 9A 51 | 文件最后修改日期 |
00C9h | 00CAh | 00CDh | 4 | D3 4F 70 57 | crc-32校验码 |
00CDh | 00CEh | 00D1h | 4 | 0A 00 00 00 | 压缩后的大小 |
00D1 | 00D2h | 00D5h | 4 | 16 00 00 00 | 压缩前的大小 |
00D5h | 00D6h | 00D7h | 2 | 08 00 | 文件名长度 |
00D7h | 00D8h | 00D9h | 2 | 24 00 | 扩展区长度 |
00D9h | 00DAh | 00DBh | 2 | 00 00 | 文件注释长度 |
00DBh | 00DCh | 00DDh | 2 | 00 00 | 文件开始位置的磁盘编号 |
00DDh | 00DEh | 00DFh | 2 | 00 00 | 内部文件属性 |
00DFh | 00E0h | 00E3h | 4 | 20 00 00 00 | 外部文件属性 |
00E3h | 00E4h | 00E7h | 4 | 2E 00 00 00 | 本地文件标头即是 [LOCAL FILE HEADER 2] 相对偏移量(offset值) |
00E7h | 00E8h | 00EFh | 8 | 79 79 64 73 2E 74 78 74 | 文件名内容 |
00EFh | 00F0h | 0113h | 36 | 0A 00 20 00 00 00 00 00 01 00 18 00 FC D9 0F A6 43 D8 D6 01 CE C7 48 B2 43 DB D6 01 48 1E AE 67 43 DB D6 01 | 扩展区内容 |
0113h | 0113h | 0113h | 0 | Null | 文件注释内容 |
End of central directroy record | |||||
END | |||||
0114h | 0114h | 0117h | 4 | 50 4B 05 06 | 中心目录结束标头 |
0117h | 0118h | 0119h | 2 | 00 00 | 当前磁盘号 |
0119h | 011Ah | 011Bh | 2 | 00 00 | 中心目录开始位置的磁盘编号 |
011Bh | 011Ch | 011Dh | 2 | 02 00 | 该磁盘上所记录的中心目录实体数量 |
011Dh | 011Eh | 011Fh | 2 | 02 00 | 中心目录实体总数 |
011Fh | 0120h | 0123h | 4 | B6 00 00 00 | 中心目录的大小 |
0123h | 0124h | 0127h | 4 | 5E 00 00 00 | 中心目录起始位置相对于初始磁盘号的偏移量 |
0127h | 0128h | 0129h | 2 | 00 00 | .zip文件注释长度 |
0129h | 0129h | 0129h | 0 | Null | .zip文件注释内容 |
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。也欢迎您共享此博客,以便更多人可以参与。如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。谢谢 !