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

本文是一个系列. 主要是分享我最近一年做7z文件开发的经验. 主要包括7z官方源码的结构分析, 以及7z文件格式的分析. 其中涉及到7z源码结构的各个细节, 以及7z文件格式的具体细节. 本文适合对象: 想要了解学习7z源码的开发人员, 想要了解7z文件格式细节, 做7z文件压缩器和解压器的开发人员, 以及其他压缩文件爱好者等等.

目前7z的最新稳定版是9.20, 而9.30版本还在alpha版本. 所以本文是基于其9.20版本.  我将尽可能详细的描述所有细节, 但到目前为止我了解到的细节大概能到八成到九成的样子. 也不是百分百.  希望能和大家共同讨论学习.  这些信息足以开发一个工业级别的高兼容性的7z压缩器和解压器了.

本文首发在我的个人独立博客  http://byNeil.com 以及博客园.  欢迎大家浏览我的独立博客, 留言交流. 转载请注明出处链接. 本人保留一切权利.  但本人不对使用本文提供的代码造成的损失负责.

好了, 憋死我了, 前面的客套话终于说完了.  有人可能要问, 为什么要分析7z文件格式? 这个不是开放的吗? 为什么我前面说我只了解到八,九成, 而不是百分百呢?

我先来解释这几个问题, 这能说明本文的必要性, 以及看下去的必要性.  首先7z的确是开放的. 但他的格式说明非常简单, 简直是简陋. 简单的一个txt文件,寥寥几十行算不上说明的符号, 对复杂的7z格式来说, 简直就是天书.( 后面分析7z源码的时候会详细说道这一点. )  所以如果你接到老板的一个通知:"我们要做7z兼容的压缩解压器" 的时候, 你就要崩溃了.  因为相对于zip这些经过标准化的文件格式来说, 7z几乎就是一个黑洞.(zip有标准化的 spec, 里面有详细到字节级别的说明).   所以我分析7z格式可以说有一半是通过阅读源码逆向推测出文件格式的, 再经过反复和源码对比测试证明其正确性的.  所以我只能说了解到了八九成, 而不是百分百.

先分享一些有用的链接:

7z的官方主页: http://www.7-zip.org/  (它托管在sourceforge的虚拟机上, 本来能打开的, 但是前一段时间开始被墙了, 我实在想不到墙它的理由, 可能是被sourceforge主机上其他的网站拖累的吧,你懂的).

这是sourceforge上7z的论坛: http://sourceforge.net/p/sevenzip/discussion/45797  . 论坛比较活跃, 每天都有新帖. 而且7z作者也在上面每天亲自回帖.  由于作者是俄罗斯人, 所以时区跟我们差的不多.  一般留言4个小时左右,  作者就能回复吧. 我问过几个问题, 都是这样的. 当然也有些帖子作者懒得回, 那就另当别论了. 呵呵.

7z的官方中文镜像: http://sparanoid.com/lab/7z/    这个不需要FQ.  是官方给出的中文版链接. 值得信赖. 上面的内容基本和官方主页保持一致.

我们先从几个概念开始吧 :    7z软件 和7z文件.   7z文件指的是一种后缀名为.7z的文件.    7z软件指的是作者开发的生成和操作7z文件的工具.  但是现在7z软件已经发展到不光支持7z格式的文件了, 还能额外的生成和编辑另外几十种文件格式了. 其中包括我们熟知的zip格式, rar格式, iso格式等等,  也包括一些不可思议的格式, 比如: CAB, CHM, CPIO, CramFS, DEB, DMG, FAT . 看眼花了吧.  好吧, 本文主要讨论 7z文件格式, 以及7z软件中主要和7z文件相关的功能. 当然也会粗略的涉及到其他的一些有用的功能,  比如如何给7z软件写插件, 让他支持我们自己定义的文件格式.

说到压缩文件, 一般会遇到两个概念,   一个是 "Compress"(压缩) 和"Archive" (存档).    "存档" 这个词个人觉得不好理解. 我个人把 "Archive" 叫做 "打包".

举个例子,  比如有一堆毛巾,  每一条毛巾代表一个文件.    "Compress"(压缩)的意思就是把毛巾里面的水拧干, 达到压缩的目的.  而"Archive"(打包) 的意思就是把这些毛巾包成一个大包, 便于运输.     所以你可能想到了, 要运输一堆这样的毛巾可能有两种方法: 第一种: 先把每条毛巾拧干并折成方块(压缩), 再把这些方块组合成一个大包(打包).  第二种, 先把这些毛巾包成一个大包(打包),  然后再把这个大包拧干.    凭经验你可能已经意识到, 前一种方法比较好处理, 而且压缩比比较大.  后一种方法就弱一点了.

对了, 前一种就是先压缩后打包的方式. 7z, zip 和rar等就是用的这种方法.   后一种就是先打包, 后压缩的方法. 常见的tar.gz的文件就是用这种方法的. 先用tar打包, 在用gz压缩.

对于7z 我们再具体解释一下 "压缩" 和 "打包" 的概念.

7z 文件格式严格的说是一种"打包"的格式,  它规定了打包的方法.   而"压缩"的任务是由不同的算法完成的.    "压缩算法"负责把毛巾里的水拧干. 具体来讲就是把一个文件按照一定规则变小.  压缩算法一般只能处理单个文件, 对于多个文件, 只能单个文件压缩, 然后再打包.

(当然,前面也说到了, 第二种方法就是先把文件打包, 然后再压缩. tar.gz就是这样的. tar工具就是简单的把所有的文件首尾相接, 变成一个大文件, 然后再用压缩算法一次压缩的.  这个不是本文的讨论对象, 所以以后就不提了.)

7z默认使用的是lzma压缩算法.   单个文件会先用lzma压缩算法压缩,  然后7z负责把压缩过后的文件打包.   (这个跟zip类似, zip文件也是打包格式, 它默认使用deflate算法压缩.)  7z还支持封装其他几种压缩算法, 比如: Lzma2, ppmd, bzip2和deflate.

这些压缩算法在7z里面都有源码,  也不是本文要讨论的重点.  我们将重点讨论7z的打包格式. 就是介绍7z具体是怎样把压缩过后的文件封装打包的.  期间也会夹杂介绍其中一些算法.  后面如果有时间, 我会再单独介绍这些算法的具体实现.

终于把前期准备介绍完了,   有点繁琐.

下一篇我们将开始具体分析介绍7z的源码.    完成之后, 我会把第二篇的链接更新到这里. 当然你也可以在我的博客中搜索到.

大家多多支持哦.

 
 
分类: 7zip

7z文件格式及其源码的分析的更多相关文章

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

    这是7z文件格式及其源码的分析系列的第五篇. 上一篇讲到了7z文件压缩流程.最近太忙了,好久没更新,都快忘了写到哪了.:) 这一篇就说说7z文件的尾头的生成方式吧. 上一篇已经讲了尾header的结构 ...

  2. 7z文件格式及其源码的分析(四)

    这是7z文件格式及其源码的分析系列的第四篇. 上一篇讲到了7z文件静态结构的尾header部分.这一篇开始,将从7z实际压缩流程开始详细介绍7z文件尾header的详细结构. 一, 第一个概念: co ...

  3. 7z文件格式及其源码的分析(三)

    上一篇在这里.  这是7z文件格式分析的第三篇, 相信有了前两篇的准备,你已经了解了7z源码的大致结构, 以及如何简单调试7z的源码了. 很多同学是不是迫不及待想要拔去7z的神秘外衣,看看究竟了. 好 ...

  4. 7z文件格式及其源码的分析(二)

    这是第二篇, 第一篇在这里: 这一篇开始分析7z的源码结构. 一. 准备工作: 1. 源码下载: 可以从官方中文主页下载:http://sparanoid.com/lab/7z/. 为了方便, 这里直 ...

  5. 7z文件格式及其源码

    7z文件格式及其源码的分析(四) 这是7z文件格式及其源码的分析系列的第四篇. 上一篇讲到了7z文件静态结构的尾header部分.这一篇开始,将从7z实际压缩流程开始详细介绍7z文件尾header的详 ...

  6. 7z文件格式及其源码linux/windows编译

    7z文件格式及其源码的分析(二) 一. 准备工作: 1. 源码下载: 可以从官方中文主页下载:http://sparanoid.com/lab/7z/. 为了方便, 这里直接给出下载链接: http: ...

  7. hadoop之hdfs------------------FileSystem及其源码分析

    FileSystem及其源码分析 FileSystem这个抽象类提供了丰富的方法用于对文件系统的操作,包括上传.下载.删除.创建等.这里多说的文件系统通常指的是HDFS(DistributedFile ...

  8. Qt QComboBox之setEditable和currentTextChanged及其源码分析

    目录 Qt QComboBox之setEditable和currentTextChanged以及其源码分析 前言 问题的出现 问题分析 currentTextChanged信号触发 源码分析 Qt Q ...

  9. Android版数据结构与算法(五):LinkedHashMap核心源码彻底分析

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 上一篇基于哈希表实现HashMap核心源码彻底分析 分析了HashMap的源码,主要分析了扩容机制,如果感兴趣的可以去看看,扩容机制那几行最难懂的 ...

随机推荐

  1. 让Sqlite脱离VC++ Runtime独立执行

    前段时间在开发OrayTalk(傲瑞通企业即时通信系统)的聊天记录模块时用到了Sqlite,这是我第一次接触和使用Sqlite,整体感觉还是很不错的.这里把我使用Sqlite的经验跟大家分享一下. 一 ...

  2. angularJS之使用指令封装DOM操作

    angularJS之使用指令封装DOM操作 创建指令 指令也是一种服务,只是这种服务的定义有几个特殊要求: 必须使用模块的directive()方法注册服务 必须以对象工厂/factory()方法定义 ...

  3. ExtJs--15--Ext.is*各种类型推断的方法,简单看源代码就能够明确了

    /** * Returns true if the passed value is empty, false otherwise. The value is deemed to be empty if ...

  4. asp.net mvc3 数据验证(二)——错误信息的自定义及其本地化

    原文:asp.net mvc3 数据验证(二)--错误信息的自定义及其本地化 一.自定义错误信息         在上一篇文章中所做的验证,在界面上提示的信息都是系统自带的,有些读起来比较生硬.比如: ...

  5. CII-原子

    <atom.h> #ifndef ATOM_INCLUDED #define ATOM_INCLUDED extern int Atom_length(const char *str); ...

  6. Android EventBus现实 听说你out该

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/40794879.本文出自:[张鸿洋的博客] 1.概述 近期大家面试说常常被问到Ev ...

  7. PHP Warning: strtotime(): It is not safe to rely on the system's timezone settings.

    有三种解决办法: 1. php文件中设置时区 <?php date_default_timezone_set('Asia/Shanghai'); echo strtotime('2012-9-3 ...

  8. 快速构建Windows 8风格应用16-SettingContract原理及构建

    原文:快速构建Windows 8风格应用16-SettingContract原理及构建 本篇博文主要介绍Setting Contract概述.Setting Contract实现基本原理.如何构建Se ...

  9. OCP-1Z0-051-题目解析-第9题

    9. Which statement is true regarding the INTERSECT operator? A. It ignores NULL values. B. Reversing ...

  10. ProvissyTool Update Support Page

    DO NOT REPLY. ############# #??????# ############