zip文件结构简析图(zip文件结构简析怎么写)
前言
上一篇文章简单讲了导出excel、word等文件的原理。其中一个非常重要的部分就是将所有xml文件和文件夹集成到一个压缩文件中。
对于单个文件,您需要将其全部集成到一个zip文件中。这里用到了另一个插件jszip。当时我用的就是这个叫jszip的插件。本文就讲一下这个zip插件的生成原理。
这里需要重申的是,所有工具插件的核心原理其实都很简单,复杂性来自于兼容性、多样的参数配置处理、功能解耦、代码预留等。这样可以让代码维护和协同开发变得更容易,但是对于看源码学习的人来说是比较痛苦的。毕竟,我并不关心每个班级做什么。
我重构了jsZip插件的核心代码,更新了注释,集成了工具方法,让调试和阅读更加友好。
话不多说,让我们开始吧。
总览
与W3C一样,对于zip或类zip压缩文件也有官方的格式规范,具体实现并不统一。
官方地址:https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
官方对zip文件的结构规定有详细规定。有些部分不是必需的。概述如下:
[本地文件头1][加密头1](加密)[文件数据1][数据描述符1](压缩)。[本地文件头n][加密头n](加密)[文件数据n][数据描述符n][归档解密头](加密)[归档额外数据记录](加密)[中央目录头1]。[中央目录头n][zip64中央目录记录结束](64位)[zip64中央目录定位符结束](64位)[中央目录记录结束]如上所示,文件的结构非常简单。数据按照先文件后文件夹的顺序添加到压缩文件中。有些结构是可选的。具体来说,整体结构如下:
文件1标头-文件1内容-.-文件n标头-文件n内容-文件夹1标头-.-文件夹n标头-文件夹尾部
文件
文件头一般包含一些描述信息,如内容长度、时间、主机平台等,官方文档有详细的定义,规范如下:
本地文件头签名4字节(0x04034b50)提取所需的版本2字节通用位标志2字节压缩方法2字节上次修改文件时间2字节上次修改文件日期2字节crc-324字节压缩大小4字节未压缩大小4字节文件名长度2字节额外字段长度2字节文件名(可变大小)额外字段(可变大小)依次解释上面的内容:
本地文件头签名这是一个固定标识符(0x04034b50),翻译成字符串为\x04\x03KP。但是,由于这里的读取方式是littleendian,所以实际输入的是PK\x03\x04
解压所需的版本表示要处理的压缩文件的级别。比如有一个文件夹,内容是用XX方式压缩的,用XX方式加密的等等,它们都是不同的值。
通用位标志内容的编码格式、是否加密等描述信息
压缩方式压缩方式,默认不压缩
最后一个mod文件时间/日期文件的时间和日期信息,默认是newDate()。关于格式,DOS平台上有规范:
time=16位,15-11存储小时,10-5存储分钟,4-0存储秒/2
假设时间为12小时34分56秒=转换后为01100(12点)100010(34分)11100(28秒)
日期=16位数字,15-9存储在1980年,8-5存储在月份,4-0存储在日期
假设时间为2022年6月29日=转换后为0101010(42)0110(6)11101(29)
crc-32完整性检查,这里暂时不展开crc32。
压缩大小/未压缩大小文件压缩长度信息。如果不进行压缩,这里的大小就是数据的长度。
文件名长度/额外字段长度字面含义
文件名文件名,可能已编码
额外字段缩写
文件头之后是文件数据,指的是文件内容。您可以选择原始内容或压缩方式进行压缩。
文件夹
文件夹就更简单了,只有描述信息和尾部。规格如下:
头
中央文件头签名4字节(0x02014b50)由2字节制作的版本提取所需的2字节通用位标志2字节压缩方法2字节上次mod文件时间2字节上次mod文件日期2字节crc-324字节压缩大小4bytes未压缩大小4字节文件名长度2字节额外字段长度2字节文件注释长度2字节磁盘号起始2字节内部文件属性2字节外部文件属性4字节本地头相对偏移量4字节文件名(可变大小)额外字段(可变大小)文件注释(可变大小)尾部
中央目录签名结尾4字节(0x06054b50)该磁盘的编号2字节中央目录开头的磁盘编号2字节该磁盘上中央目录的条目总数2字节中央目录的条目总数2字节中央目录大小4字节中央目录相对于起始磁盘号的偏移量4字节.ZIP文件注释长度2字节.ZIP文件注释(可变大小)这里还有几个参数,挑出来并解释它们。
操作系统制作的版本和编码的zip文件的版本
高位=操作系统00是DOS03是UNIX
低位=编码文件的软件版本0x0014=14=版本1.4
磁盘号起始/内部文件属性默认为\x00\x00
外部文件属性与平台相关的值
总数量.压缩文件数量/压缩文件夹数量
中心目录的大小文件夹头的总长度
起始偏移量.文件内容的长度
按照上述结构依次整合数据,最终生成zip文件。
代码实现
有了规范,就可以实现最简单的压缩文件,不压缩、不加密、不编码。
假设有一个名为Hello.txt的文件,其内容为HelloWorld\n。它被放置在默认文件夹中,需要被处理成zip文件。
首先看header,需要实现的比如时间、crc32、长度等,其余的都设置为默认值。
按2022年7月25日上午10点:计算
time:01010(10点)000000(0分钟)00000(0秒)=\x50\x00
日期:0101010(42)0111(7)11001(25)=\x54\xf9
crc32去网上找了一个工具:b095e5e3
文件名长度为9,文件内容长度为12,文件头+数据长度为51,文件夹头长度为55
对应的数据组合如下:
本地文件头[PK\x03\x04、\x0A\x00、\x00\x00、\x00\x00、\x00\x50、\xF9\x54、\xe3\xe5\x95\xb0、\x0c\x00\x00\x00、\x0c\x00\x00\x00、\x09\x00、\x00\x00、Hello.txt]
粗体字体是标题,文件夹中也应该使用它。
文件数据[HelloWorld\n]
中央目录头[PK\x01\x02、\x14\x00、\x0A\x00、\x00\x00、\x00\x00、\x00\x50、\xF9\x54、\xe3\xe5\x95\xb0、\x0c\x00\x00\x00、\x0c\x00\x00\x00、\x09\x00、\x00\x00、\x00\x00、\x00\x00、\x00\x00、\x00\x00\x00\x00,\x00\x00\x00\x00,Hello.txt]
粗体部分与文件头相同
中央目录记录结束[PK\x05\x06,\x00\x00,\x00\x00,\x01\x00,\x01\x00,\x37\x00\x00\x00,\x33\x00\x00\x00,\x00\x00]
数组中的每个值对应于文档中的一个元素。将上面的数据组合起来,得到一个长字符串,按照老的方式输出到浏览器。
函数s2ab(s){letbuf=newArrayBuffer(s.length);让视图=newUint8Array(buf);for(让i=0;i!=s.length;++i)view[i]=s.charCodeAt(i)0xFF;返回缓冲区;}const字节=[PK\x03\x04,\x0A\x00,\x00\x00,\x00\x00,\x00\x50,\xF9\x54,\xe3\xe5\x95\xb0,\x0c\x00\x00\x00、\x0c\x00\x00\x00、\x09\x00、\x00\x00、Hello.txt、HelloWorld\n、PK\x01\x02、\x14\x00、\x0A\x00、\x00\x00、\x00\x00、\x00\x50、\xF9\x54、\xe3\xe5\x95\xb0、\x0c\x00\x00\x00、\x0c\x00你好。txt,PK\x05\x06,\x00\x00,\x00\x00,\x01\x00,\x01\x00,\x37\x00\x00\x00,\x33\x00\x00\x00,\x00\x00]。加入();让blob=newBlob([s2ab(bytes)],{type:'application/octet-stream'});让url=URL.createObjectURL(blob);consta=document.createElement(a);a.href=网址;a.下载=123.zip;a.点击();setTimeout(()={URL.revokeObjectURL(url);},10000);得到一个123.zip压缩文件,解压后得到一个Hello.txt文本文件,查看修改时间。时间正好是2022年7月25日上午10点。
文件的内容也是我们写的副本:
此时,最简单的zip文件已经按照规范实现了。如果你对加密、压缩、crc32等知识点感兴趣,可以自行探索。近期我可能还会做一些简单的科普。
相关资讯
-
税务教育培训相关文件,税务教育培训相关文件有哪些详细阅读
大家好,今天小编关注到一个比较有意思的话题,就是关于税务教育培训相关文件的问题,于是小编就整理了3个相关介绍税务教育培训相关文件的解答,让我们一起看看吧。需要在…
2025-01-11 17:24:03 0
-
内蒙教育培训开学通知,内蒙教育培训开学通知文件详细阅读
大家好,今天小编关注到一个比较有意思的话题,就是关于内蒙教育培训开学通知的问题,于是小编就整理了4个相关介绍内蒙教育培训开学通知的解答,让我们一起看看吧。内蒙古…
2024-12-14 11:24:03 0
-
学前教育双过半文件,学前教育双普政策详细阅读
大家好,今天小编关注到一个比较有意思的话题,就是关于学前教育双过半文件的问题,于是小编就整理了3个相关介绍学前教育双过半文件的解答,让我们一起看看吧。二泉映月歌…
2024-11-18 21:00:11 0
-
教育培训新政策,教育培训新政策文件详细阅读
大家好,今天小编关注到一个比较有意思的话题,就是关于教育培训新政策的问题,于是小编就整理了2个相关介绍教育培训新政策的解答,让我们一起看看吧。教育培训改革根本原…
2024-11-14 17:48:13 0
-
江阴家庭教育文件下载,江阴家庭教育文件下载网站详细阅读
大家好,今天小编关注到一个比较有意思的话题,就是关于江阴家庭教育文件下载的问题,于是小编就整理了3个相关介绍江阴家庭教育文件下载的解答,让我们一起看看吧。江阴遛…
2024-11-06 06:24:03 0