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的源码. 第二篇在这里: http://www.cnblogs.com/shuidao/p/3266092.html
大家多多支持哦.
转载于:https://www.cnblogs.com/shuidao/p/3262304.html
7z文件格式及其源码的分析相关推荐
- Feign的调用原理及其源码分析
Feign的调用原理及其源码分析 目录 概述 架构特性 设计思路 实现思路分析 Feign是如何进行服务调用的 拓展实现 相关工具如下: 实验效果:(解决思路) 分析: 小结: 参考资料和推荐阅读 L ...
- NJ4X源码阅读分析笔记系列(一)——项目整体分析
NJ4X源码阅读分析笔记系列(一)--项目整体分析 NJ4X是什么 参见NJ4X的官网:http://www.nj4x.com/ Java and .Net interfaces to support ...
- 数值分析 使用c语言 源码_分析源码,学会正确使用 Java 线程池
在日常的开发工作当中,线程池往往承载着一个应用中最重要的业务逻辑,因此我们有必要更多地去关注线程池的执行情况,包括异常的处理和分析等.本文主要聚焦在如何正确使用线程池上,以及提供一些实用的建议.文中会 ...
- 高通android开源代码下载,高通平台Android源码bootloader分析之sbl1(三)
前两篇博文分析了启动流程.代码流程.cdt,接下来就分析另外几个需要格外关注的部分. ##log系统 sbl1中的log系统也是sbl1部分调试会经常接触得部分高通平台在sbl中做的log系统并不是很 ...
- 【java】java JUC 同步器框架 AQS AbstractQueuedSynchronizer源码图文分析
1.概述 转载:JUC锁: 锁核心类AQS详解 AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore ...
- Android版数据结构与算法(五):LinkedHashMap核心源码彻底分析
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 上一篇基于哈希表实现HashMap核心源码彻底分析 分析了HashMap的源码,主要分析了扩容机制,如果感兴趣的可以去看看,扩容机制那几行最难懂的 ...
- 码出高效:Java开发手册笔记(线程池及其源码)
码出高效:Java开发手册笔记(线程池及其源码) 码出高效:Java开发手册笔记(线程池及其源码) 码出高效:Java开发手册笔记(线程池及其源码) 前言 一.线程池的作用 线程的生命周期 二.线程池 ...
- android代码流分析工具,视频码流分析工具(Elecard StreamAnalyzer)下载 v4.0.171116 官方版 - 比克尔下载...
Elecard StreamAnalyzer是一个专业的视频码流分析工具,拥有码流错误报告.TS错误侦测和基于ETSI TR101-290的分析功能,能够对编码器媒体流进行深入的句法分析,支持H.26 ...
- AVI文件格式简介与WAV文件分析
AVI文件格式简介与WAV文件分析 AVI文件格式(回答问题) 所有AVI文件至少包含2个必须的LIST Chunk和一个索引Chunk Chunk: LIST Chunk: 小端:数据的低位保存在内 ...
最新文章
- 错误信息输出,重定向到文件
- C++纯虚函数 virtual =0
- java内部float,Java中的float是什么?
- python字典进行大写转化_python之字典的增删改查
- mysql安装中出现的问题,
- 世纪互联云和华为共同打造的数据中心是一个很好的一步标志!
- php比例算法,图片比例转换算法
- python执行过程打印,如何在pytest运行过程中看到正常的打印输出?
- sccm 2007 r2 step by step 之十五 补丁管理
- Android 驱动(2)---MTKAndroid添加驱动模块
- arm linux装wine,Ubuntu下安装wine详细介绍
- Css中实现一个盒子固定宽度,另一个盒子宽度自适应的方法
- 解决flash的虚框问题
- 976. 三角形的最大周长
- zz:测试还是开发?
- CentOS7安装显卡驱动
- epoch训练时间不同_epoch、batch size和iterations
- 【DeepLearning】【环境配置】Ubuntu 下手动调节 Nvidia 显卡风扇转速
- mybatis_mysql使用 学习笔记
- Ip地址基础--全篇无废话