zip文件的格式
zip文件是无损数据压缩的一种文件格式。zip文件可以包含多种不同压缩方式或者不压缩的文件。
zip文件准许多种压缩算法,目前普遍使用的是DEFLATE
压缩算法,该算法是1989年出现的。
zip文件一般都是.zip
扩展,但是很多页可以采用其他的扩展方式,如android的.apk
。zip文件的MIME类型为application/zip
。
zip文件的设计特点
- zip里的每个文件都是单独存储的,相互之间没有干扰,并且使得对每个文件没有太大的限制(即可以是任何压缩算法处理过的文件)
- 同时由于上面的特点,使得可以在不解压的情况下去除或加入某个文件,并且自动实现的压缩【而tar文件则不能】
- 在zip文件的尾部,设置了目录数据,用来描述整个压缩文件包含的文件列表,指示zip文件里有哪些文件,以及文件在zip里的位置。这个的好处就是可以在不读取整个zip文件就能知道zip里有哪些文件。
- zip文件可以包含跟zip文件没任何关系的扩展数据,这个特性可以将一般的zip文件制作成
自解压文档
,它相当于是一个可执行文件了(就是可以将代码塞入zip文件里) - zip文件采用CRC算法进行校验,同时对数据结构进行了备份,以最大程度的保护数据不丢失
zip文件的结构
zip文件由三个部分组成:
- 文件内容块
- 目录中心
- EOCD(End of central diretory record)
维基百科上的图示:
文件内容块
记录着压缩的所有文件的内容信息。
file header
描述了改文件的一些基本信息,如文件大小、压缩方式、扩展名等。
file data
这里就实际的存储了文件的内容。
data descriptor
这个不一定有,只有在头部标志第3位(掩码0×08)置位时才有写入。
这里的size值和crc值跟file header里的关系?
【个人观点】file header了的应该是整个文件的size和crc,而data descriptor应该只是file里的内容的size和crc。
什么情况下需要有?
【别人观点】数据描述符只用在不能对输出的 ZIP 文件进行检索时使用。例如:在一个不能检索的驱动器(如:磁带机上)上的 ZIP 文件中。如果是磁盘上的ZIP文件一般没有这个数据描述符。
目录中心
对于待压缩的目录而言,每一个子目录对应一个压缩目录源数据,记录该目录的描述信息。压缩包中所有目录源数据连续存储在整个归档包的最后,这样便于向包中追加新的文件。
针对压缩文件中存在目录的,也就是说,如果没有目录,则这个字段就是没有的。
在zip里的结构:
它的每个item的详细信息包括:
EOCD
标记整个zip包的结束。
它只有1条记录,这条记录的详细内容:
完整的一个zip文件的格式:
可以看出最上面的才是最重要的,中间的部分是对上面部分的文件结构关系的补充,而最下面又是对上面目录的偏移量等一些信息的补充。