7z文件格式及其源码的分析(四) – -Neil

这是7z文件格式及其源码的辨析级数的第四音级篇. 上一篇讲到了7z文件静力学构成的尾header嫁妆.这一篇开端,将从7z现实的紧缩议事程序开端清楚的绍介7z文件尾header的清楚的构成.

一, 宁愿点钟动机 编码器。

在7Z紧缩科技流程中, 少量地钟非凡的小片的动机执意编码器。 编码器代表算法, 通常是指紧缩或解紧缩算法(包孕抑制器) 譬如, 在7Z中,LZMA算法是编码器。,  deflate算法也少量地钟编码器。  7z中用于编密码的AES256算法也少量地钟编码器。  

因而在动机上, 能处置少量地钟文件流的算法执意少量地钟编码器。 处置的动机可以紧缩/解紧缩。, 编密码等。

(图1)

通常来讲, 编码器要批评处置少量地钟出口流。, 而且独自的少量地钟出口流。 譬如,文件流被紧缩成出口流。  只因为, 7Z说话中肯某一编码器可以将出口流处置成多个出口流。, 倒过来,多个流可以被罪状流。 譬如,7Z BCJ2 coder, 它是少量地钟抑制器编码器。, 少量地钟EXE文件可以被过滤成四元组出口流。 这么少量地钟词, 传播了7Z编码器的动机。 可以同时处置多个出口流。, 可以出口多个流

(2)

在这少量地上朕可以简略地体会紧缩科技流程。

1. 简略紧缩科技流程, 将文件流使调动给LZMA 编码器紧缩。

(图3)

2. 多编码器级数, 在理论上,一些两个编码器都可以级数衔接。, 级数级数不受限度局限。, 它可以与一些多个阶段级数。 自然, 熵的在性, 将紧缩编码器级数是缺席意思的。

在这少量地上是最经用的办法短暂拜访。,它被紧缩和编密码。

(图4)

坚持到底上述的图说话中肯O1, 和 i2.   O1是宁愿编码器的出口流。, I2是以第二位编码器的出口流。 在现实的操作中, 这两个流现实的上是同少量地钟流。, 整齐的将宁愿出口作为以第二位出口。

失压的科技流程是下面的反向科技流程。

过去的图片是少量地钟相干上地详尽的的紧缩科技流程。

二, 以第二位动机 Folder, 它批评文件夹。

在这少量地上的文件夹应当特殊坚持到底它, 这批评朕通常提到的文件夹。 这批评物理现象说话中肯一些东西。  

在7Z开端紧缩先前, 文档归类, 普通而言,它推理文件类型和文件能否必要停止归类。   像, 将懂得EXE文件划分为少量地钟类(文件夹), 或许把必要编密码的懂得文件放合作。 附加的人. 归类的详细办法将下赌注于阐明。 这种归类办法决不要紧。, 在7Z实现预期的结果中应用的办法简略。 确实,结果你希望的事实现预期的结果少量地钟7Z的紧缩器, 这种归类办法是通行无阻的。 可以将每个文件划分为文件夹。

让朕看待少量地钟先例

(图5)

 在同样先例中, 朕总共同体5个文件要紧缩。

1. 率先, 短暂拜访必然的字组分类办法, 朕分为两个文件夹, 宁愿点钟文件夹包孕 a.exe, b.exe 和 三倍的文件。 以第二位个文件夹包孕 和 b.txt.

2. 对Folder1来说, 它包住三个文件, FLUDR1级数简略三级数文件,作为少量地钟大文件, 作为出口流 i1 给CODDE1 用. 下少量地钟科技流程是上述的 图4 的容量是什么?

在7Z源信号中:\CPP\7Zip \存档\7Z 在同样列入目录下,有  和 特意处置把多个文件级数假装成少量地钟文件的责任. 从Coder1 看成绩的观念, 它只了解有少量地钟文件流 i1, 我不了解同样I1 这是一份真实的文件。 或许短暂拜访文件夹假装。

现实的上, 7Z动机中最小的紧缩单位批评文件。, 它是文件夹, 它将率先将懂得文件恢复到响应的文件夹。, 话说回来 让同样文件夹变得文件流, 短暂拜访多个编码器的流量。 让朕笼统下面的紧缩科技流程。

(图 6)

图说话中肯字母系统 ”i” 出口的意思, ”o” 表现出口。 前面的数字是序列号。   简略解说, 该文件夹流头等用作CODR1。 出口流I1。 Coder1 出口流是O1。 同样O1也被用作少量地钟 i2 CODAR2的出口, 话说回来是CODR3。    

值当坚持到底的是基本原理少量地钟编码器的出口流。 O3。 它是紧缩的终极出口。 它高等的字组分类流。在7Z 这是一草率地行事的浜。 朕称之为P1。 结果有多个文件夹, 话说回来每个文件夹将有少量地钟或多个PACKEDFROW。 因而懂得文件在紧缩后特权市被紧缩。 pn. N包流将按次回忆。 7Z的文件体, 执意上一篇文字中绍介的以第二位嫁妆.

每个文件夹 包住总计文件, 每个文件大小的细目等都回忆在7Z的嵌上题名中。 外面有这一嫁妆

      NumFolders
      Folders[NumFolders]
      {
        NumCoders
        CodersInfo[NumCoders]
        {
          ID
          NumInStreams; 代表同样编码器 被受理的出口流的量子, 普通是1。
          NumOutStreams; 代表同样编码器的出口流的编号, 普通是1。.
          PropertiesSize 少量地钟int值, 其次的属性的音节一节
          Properties[PropertiesSize] // 音节阻止, 编码器的某一设置知识, 譬如,紧缩依等级排列, 或许AES编密码IV等。 
        }
        NumBindPairs  // 表现bindpair 数字的编号。 Bindpair表现出口流与出口私下的绑定相干。  譬如,在下面的图6中, O1和I2是绑定的, O2和I3化合。
        BindPairsInfo[NumBindPairs] 绑定对阻止, 记载每个绑定对。
        {
          InIndex;  该绑定的出口提供线索,  它是下面图中响应的少量地钟 我前面的序列号。 (为难), 缺席坚持到底到这幅画。,下表为1。,但确实,你懂的, 它们都是从0开端的。上图中懂得下标应增加
          OutIndex; 绑定响应的出口提供线索, 它是下面图中O前面的序列号。  同上。 
        }
        PackedIndices //这表现同样folder终极出口的packstream在懂得packstream说话中肯序号.
      }
      UnPackSize[Folders][] // 这是少量地钟两位阻止。, 记载每个文件夹对应的出口流数字的编号。
      CRCs[NumFolders] 这是少量地钟CRC阻止。, 无文件夹 鱼贯而行的CRC, 7Z眼前不应用同样实地的。 

对下面的构成做少量地解说

1. NumFolders, 显示少量地钟It32值, 它记载了7z文件中共同体总计个Folder.

2. 前面是文件夹阻止, 一次组态每个文件夹. 每个文件夹构成如次:

3. NumCoders, int32值, 记载了同样Folder总共进过了两三个编码器。

4. 前面是懂得编码器的阻止。, 每个编码器的构成 显示编码器 的id. 这是编码器的不料标示。 同样ID的明确在doc/Directory中 . 

5. 更清楚的的知识, 请看下面信号前面的正文。

6. 让我再加强少量地。,我缺席坚持到底我的画家的风格。,因而我和O前面的序列号从1开端。, 现实的上,你懂的, 每个铺子的序号从0开端。, 去甲反对。 结果你发觉序列号与我所说的卓越的。, 请校对一下。  缺席反对, 懂得序数从0开端。 包孕我未来能够画的戏剧性的场面。 记诵这一切都是从0开端的。

7, 死气沉沉的一件事是, 譬如,下面图片说话中肯文件夹短暂拜访 coder1, coder2 和coder3 这三个编码器。 当三编码器回忆在现实的中时, 它以相反的次回忆。, 这是宁愿点钟对自然环境的保护CODR3, 话说回来是CODR2, 基本原理是coder1. 这是为了适当的解紧缩。

下面的图6是少量地钟相比详尽的的紧缩科技流程。,   失压的科技流程是相反的。, 率先优美的体型CODR1, coder2 和coder3, 话说回来反向流终极解紧缩。

每个文件夹特权市短暂拜访一次详尽的的紧缩科技流程.

好了, 绍介了次要的紧缩科技和构成。   下一篇文字将向您显示什么回忆残余物的文件细目。, 此外发展终极标头的方法。

基本原理,欢送到达我的孤独视频博客  

写这么多话单词, 画画不容易。, 让朕把它猛吃, 伴计们,伴计们。

发表评论

电子邮件地址不会被公开。 必填项已用*标注