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文件的格式:

可以看出最上面的才是最重要的,中间的部分是对上面部分的文件结构关系的补充,而最下面又是对上面目录的偏移量等一些信息的补充。

DEFLATE算法

results matching ""

    No results matching ""