首页 家庭教育 zip文件结构简析图(zip文件结构简析怎么写)

zip文件结构简析图(zip文件结构简析怎么写)

家庭教育 2024-05-12 23:13:01 801 教育网

前言

上一篇文章简单讲了导出excel、word等文件的原理。其中一个非常重要的部分就是将所有xml文件和文件夹集成到一个压缩文件中。

zip文件结构简析图(zip文件结构简析怎么写)

对于单个文件,您需要将其全部集成到一个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等知识点感兴趣,可以自行探索。近期我可能还会做一些简单的科普。

教育网 Copyright @ 2005-2025 All Rights Reserved. 版权所有 备案号:渝ICP备2023012207号-4

免责声明: 1、本站部分内容系互联网收集或编辑转载,并不代表本网赞同其观点和对其真实性负责。 2、本页面内容里面包含的图片、视频、音频等文件均为外部引用,本站一律不提供存储。 3、如涉及作品内容、版权和其它问题,请在30日内与本网联系,我们将在第一时间删除或断开链接! 4、本站如遇以版权恶意诈骗,我们必奉陪到底,抵制恶意行为。 ※ 有关作品版权事宜请联系客服邮箱:478923*qq.com(*换成@)

Baidu
map