上一篇在这里. 这是7z文件格式分析的第三篇, 相信有了前两篇的准备,你已经了解了7z源码的大致结构, 以及如何简单调试7z的源码了. 很多同学是不是迫不及待想要拔去7z的神秘外衣,看看究竟了. 好, 这就带你们一探乾坤. 本文开始,我们详细介绍7z的文件存储结构.
要了解7z的结构, 当然最好从官方的说明开始, 尽管这个说明非常简略, 但它的确是我入门时的救命稻草.
打开源码的 "DOC" 目录. 这里面就是官方所有的文档了. 其中只有二个文档跟结构相关:
1. 7zFormat.txt, 这是我们的主角, 里面介绍了7z文件的大体结构.
2. Methods.txt, 这里面介绍了7z压缩算法id的编码规则, 以后会用到.
我们从7zFormat.txt文件开始.
Archive structure ~~~~~~~~~~~~~~~~~ SignatureHeader [PackedStreams] [PackedStreamsForHeaders] [ Header or { Packed Header HeaderInfo } ]
上面就是7z文件的总体结构了. 我来稍微解释一下. 上面的代码中, 从波浪线往后开始算. 7z的文件结构基本上分为三部分:
1. 前文件头(就是最前面的header).
2. 压缩数据.
3. 尾文件头(就是放在文件末尾的header).
一, 前文件头就是上图中的 "SignatureHeader". 它是32个字节定长的. 前文件头其实记录的信息很少, 它的主要目的是记录尾文件头的位置, 压缩的主要结构都是存在尾文件头中.
它的结构如下:
SignatureHeader ~~~~~~~~~~~~~~~ BYTE kSignature[6] = {'7'