7z文件格式及其源码的分析(五)

这是7z文件格式及其源码的分析系列的第五篇. 上一篇讲到了7z文件压缩流程。最近太忙了,很久没更新,都快忘了写到哪了。:)算法

这一篇就说说7z文件的尾头的生成方式吧。 上一篇已经讲了尾header的结构了。它其实就是记录了压缩文件详细信息。加密

那么尾header是如何存储的呢?

先看一个图:blog

1

这是整个7z文件的结构。  最后面的绿色“尾文件头” 就是咱们要说的目标。递归

7z的尾文件头有两种存储方式。

第一,  最简单的, 就是把尾文件头的内容直接写在后面, 不作任何处理。ip

这种方式最简单,可是却最不经常使用。 缘由是什么。 咱们看上一篇中说到的尾文件头的内容就知道了。 举个简单的例子, 比方说你要压缩大量的文件,好比100个文件吧。 为文件头里面就会有大量的空间用来存储文件名,文件大小,文件时间等等。  一般这些信息不少,可是有个共同特色就是重复信息多。 咱们知道,对于这些简单的文本信息,其可压缩性很是强。 换句话说,这些信息的压缩比特别大。  因而, 这就引出了,另外一种压缩方式。get

第二, 把原始的尾header信息用lzma算法再压缩一次。这样能够显著的减小尾header的大小。尤为是在大量文件的时候。源码

咱们来看一个图:博客

2

实际怎么生成的呢。 这实际上是一个递归过程。class

尾文件头压缩的思路就是把原始的尾文件头数据当作一个单独的文件流来进行一次前面的压缩过程。就是重复一次前面的7z的压缩过程。 不过这一次只有一个文件,所以只划分一个Folder. 并且压缩方法是指定的LZMA。也就是说只有一个Coder参与。   固然,原始尾文件头的内容可能有敏感信息。 好比里面的文件名等等信息。所以,7z也提供能力在压缩尾文件头的时候同时加密它。 因此压缩尾文件头的时候若是选择加密头信息,则会加入AES Coder加密。密码

3

 

因此实际尾header就是这样存储的,上面的 PH, 和HH。

 

用户在压缩7z文件的时候,能够选择是否加密文件, 而且能够同时选择是否加密文件头。

若是用户只加密文件,而不加密文件头。 这样的文件,双击直接用7z打开,能够看到里面的文件结构。文件详细信息,可是不能解压文件出来,除非有密码。

若是同时选择加密文件和文件头。 双击这样的文件,7z会直接提示请输入密码,不然连文件结构都看不见。 缘由就在这里。 由于文件的结构信息也被加密了,没有密码,连文件头都解压不开。

这一点必zip文件先进, zip只支持文件内容加密。

不知道说清楚了没。暂时就到这吧。欢迎你们访问个人我的独立博客:http://byNeil.com   你们若是有对7z有兴趣,欢迎你们联系我,探讨交流。

下一篇给你们介绍7z如何实现流式压缩和解压的, 以及其余一些7z的trick。

相关文章
相关标签/搜索