这是7z文件格式及其源码的分析系列的第五篇. 上一篇讲到了7z文件压缩流程。最近太忙了,好久没更新,都快忘了写到哪了。:)
这一篇就说说7z文件的尾头的生成方式吧。 上一篇已经讲了尾header的结构了。它其实就是记录了压缩文件详细信息。
那么尾header是如何存储的呢?
先看一个图:
这是整个7z文件的结构。 最后面的绿色“尾文件头” 就是我们要说的目标。
7z的尾文件头有两种存储方式。
第一, 最简单的, 就是把尾文件头的内容直接写在后面, 不做任何处理。
这种方式最简单,但是却最不常用。 原因是什么。 我们看上一篇中说到的尾文件头的内容就知道了。 举个简单的例子, 比方说你要压缩大量的文件,比如100个文件吧。 为文件头里面就会有大量的空间用来存储文件名,文件大小,文件时间等等。 通常这些信息很多,但是有个共同特点就是重复信息多。 我们知道,对于这些简单的文本信息,其可压缩性非常强。 换句话说,这些信息的压缩比特别大。 于是, 这就引出了,另一种压缩方式。
第二, 把原始的尾header信息用lzma算法再压缩一次。这样可以显著的减少尾header的大小。尤其是在大量文件的时候。
我们来看一个图:
实际怎么生成的呢。 这其实是一个递归过程。
尾文件头压缩的思路就是把原始的尾文件头数据当做一个单独的文件流来进行一次前面的压缩过程。就是重复一次前面的7z的压缩过程。 不过这一次只有一个文件,因此只划分一个Folder. 而且压缩方法是指定的LZMA。也就是说只有一个Coder参与。 当然,原始尾文件头的内容可能有敏感信息。 比如里面的文件名等等信息。因此,7z也提供能力在压缩尾文件头的时候同时加密它。 所以压缩尾文件头的时候如果选择加密头信息,则会加入AES Coder加密。
所以实际尾header就是这样存储的,上面的 PH, 和HH。
用户在压缩7z文件的时候,可以选择是否加密文件, 并且可以同时选择是否加密文件头。
如果用户只加密文件,而不加密文件头。 这样的文件,双击直接用7z打开,可以看到里面的文件结构。文件详细信息,但是不能解压文件出来,除非有密码。
如果同时选择加密文件和文件头。 双击这样的文件,7z会直接提示请输入密码,否则连文件结构都看不见。 原因就在这里。 因为文件的结构信息也被加密了,没有密码,连文件头都解压不开。
这一点必zip文件先进, zip只支持文件内容加密。
不知道说清楚了没。暂时就到这吧。欢迎大家访问我的个人独立博客:http://byNeil.com 大家如果有对7z有兴趣,欢迎大家联系我,探讨交流。
下一篇给大家介绍7z如何实现流式压缩和解压的, 以及其他一些7z的trick。