信息论大论文.docx
- 文档编号:23087501
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:16
- 大小:212.13KB
信息论大论文.docx
《信息论大论文.docx》由会员分享,可在线阅读,更多相关《信息论大论文.docx(16页珍藏版)》请在冰豆网上搜索。
信息论大论文
7z文件格式研究
目录
7z文件格式研究1
摘要3
第一章背景介绍4
1.1压缩软件4
1.27z文件格式4
1.37-ZIP软件4
第二章主流压缩算法6
2.1主流压缩算法简介6
2.2熵编码算法6
2.3游程编码算法7
2.4字典压缩算法8
2.5当前常用的压缩算法9
第三章7-ZIP软件工作流程10
3.1工作流程10
3.2Floder概念12
3.27z文件格式解析13
第四章7-ZIP软件实现17
4.1新算法的加入17
4.2算法加入前后压缩性能的对比17
第五章结论19
参考文献20
摘要
随着信息技术产业的高速发展,数据的本身的质和量都在不断地变大,由此,对数据压缩和打包的需求也与日俱增;同时,数据安全性要求不断地提高。
压缩软件进入了人们的视野。
现如今,压缩软件已经成为每台智能设备上必备的软件之一。
而7z是一种可以使用多种压缩算法进行数据压缩的档案格式。
因此,本人在学习了压缩编码的基本知识的基础上对压缩软件进行了相关的研究。
本人通过解读7-ZIP压缩软件源码、研究了7z文件的结构,了解了7-ZIP软件的工作原理,并在在7-ZIP软件中添加了PAQ压缩算法,进一步提升7-ZIP的工作性能。
并对改进后的软件进行了性能分析。
第一章背景介绍
1.1压缩软件
压缩软件,通常也称为解压缩软件。
是实现文件流的压缩、解压缩、加密、解密功能的应用软件。
现阶段,压缩软件已经成为每个智能设备的标配软件。
现如今的压缩软件都配上了丰富的图形界面。
当前常用的压缩软件主要有WinRAR、WinZip、好压、快压、360压缩以及7-ZIP压缩等软件。
由于动辄上百G甚至上T的硬盘普及和宽带网络时代已经到来,压缩软据软件的实质的压缩性能也就显得不那么重要了。
压缩软件之所以现在依旧流行,是因为其归档技术,就是将数量众多的小文件可以聚合成为一个较大的文件,这样在互联网中进行传输的时候会更加方便。
而且现在的压缩软件都逐步加入云功能,实现云备份。
但是,本文的研究重点仍旧放在了压缩文件的压缩和解压特性上。
1.27z文件格式
7z文件指的是一种后缀名为.7z的文件。
7z文件格式严格的说是一种"打包(Archive)"的格式,它规定了打包的方法。
同时也采用了无损压缩算法,其中7z默认的压缩算法是LZMA算法。
7z格式是开源且具备模块化的组件结构,这就使得第三方可以使用任何压缩,转换或加密算法,而不需要得到软件开发者的许可。
当前许多公司开发的压缩软件都是在7z的源码基础上进行适当的更改而得到的。
7z格式还具有最高的压缩比,并且其配置了强大的AES-256加密算法,这使得7z格式无论在性能上还是安全性上都具有非常好的利用价值。
而且用户可以随意更改和配置压缩的算法,使得其灵活度大大提升。
并且7z支持多线程压缩,使得其具有更高的CPU利用率。
1.37-ZIP软件
7-ZIP是一款有极高压缩比的开源压缩软件,大多数源代码都基于GNULGPL许可协议下发布,可任意使用。
这就使得很多开发者可以使用7-ZIP的源码进行二次开发,从而使得市场上有着较多的性能高并且免费的压缩软件。
7-ZIP软件不仅仅能对7z格式进行压缩和解压,同时也可以对多种其他的压缩格式进行压缩和解压,比如ARJ,CAB,CHM,CPIO,DEB,DMG,HFS,ISO,LHA,LZH,LZMA,NSIS,RPM,RAR,SPLIT,SWM,TBZ,TBZ2,TGZ,TPZ,VHD,WIM,XAR,Z格式。
由于该软件开源,所以开发者可以任意修改其源码,使其支持更多的格式,实现更多的功能。
7-ZIP默认使用了LZMA与LZMA2算法,这就使得其具有极高的压缩比。
通过实际的数据可以得到,对于ZIP及GZIP格式,7-Zip能提供比使用PKZip及WinZip高2-10%的压缩比。
具体测试结果如表1:
软件名称
MozillaFirefox
GoogleEarth
65个文件
85280391字节
483个文件
110700519字节
压缩后
压缩比
压缩后
压缩比
7-Zip9.35
-mx
39357375
100%
15964369
100%
WinRAR5.20
-m5-s-ma5-md128m
41789543
106%
17035432
107%
表1
而且7-ZIP本身就提供了完善的AES-256加密算法,并提供了完整的加密解密框架,可以使得第三方开发者进行二次开发。
由于7-ZIP是开源软件,因此,7-ZIP软件不能仅仅能在Windows平台下使用,在Linux和Unix平台下都有较好的兼容性。
本人通过阅读7-ZIP源码,了解7z文件格式,理解了7-ZIP的工作流程,然后向7-ZIP中加入新的压缩算法,进一步提升7-ZIP软件的工作性能。
第二章主流压缩算法
2.1主流压缩算法简介
对于压缩软件来说,无论其实现多么复杂的功能,其核心仍旧是压缩算法。
现阶段主要有两种压缩算法:
有损压缩算法和无损压缩算法。
有损压缩算法通过移除在保真情形下需要大量的数据去存储的小细节,从而使文件变小。
在有损压缩里,因某些必要数据的移除,恢复原文件是不可能的。
有损压缩主要用来存储图像和音频文件,同时通过移除数据可以达到一个比较高的压缩率,由于压缩软件要保证数据的完整性,因此本文不讨论有损压缩算法。
无损压缩算法,也使文件变小,但对应的解压缩功能可以精确的恢复原文件,不丢失任何数据。
无损压缩算法被广泛的应用在计算机领域,从节省电脑的空间,到通过web发送数据,都在使用无损压缩算法。
无损压缩算法可行的基本原理是,任意一个非随机文件都含有重复数据,这些重复数据可以通过用来确定字符或短语出现概率的统计建模技术来压缩。
统计模型可以用来为特定的字符或者短语生成代码,基于它们出现的频率,配置最短的代码给最常用的数据。
这些技术包括熵编码、游程编码以及字典压缩。
下面就分别介绍这几种主流的无损压缩算法。
2.2熵编码算法
数据压缩中,平均来说为了表示一个字符或短语,熵编码意味着所需要的最少比特数。
一个基本的熵编码编码器包括一个分析模型以及一套编码。
输入文件被解析,并产生一个由字符出现概率组成的统计模型。
然后,编码器可以利用该统计模型去决定该给每一个字符多少个比特,从而使得最常用的字符用最短的编码,反之最不常用的字符用最长的编码[1]。
其中最早的熵编码是Shannon-Fano编码,该压缩编码于1949年由ClaudeShannon和RobertFano发明。
这个技术的其中一个步骤是产生一个代表字符出现概率的二叉树。
字符以这样一种方式排序,出现得越频繁的字符越靠近树的顶端,越不常见的越靠近树的底部。
产生Shannon-Fano编码的步骤如下[1]:
1.解析输入,统计每一个字符出现的频率。
2.根据是上述频率计算字符的概率。
3.依据概率对字符降序排序。
4.为每一个字符生成一个叶节点。
5.把字符列表分为左右两部分,使得左边的概率与右边的概率大致相当。
6.左节点加编码”0”,右节点加编码”1”。
7.对两棵子树重复的步骤5和6,直到所有的字符节点都成为叶子节点。
由于二叉树是自下而上构建的,因此Shannon-Fano编码不总是能够产生最优的编码。
由于这个原因,使用的较多的还是对于任意输入都能够得到最优编码的Huffman编码。
Huffman编码也是一种熵编码,其二叉树是自上而下构建的,因此其能产生最优编码。
但是如果单论压缩比,Huffman算法并不是最优的压缩算法,算术编码算法确实是一个最优的熵编码技术,通常压缩比方面算术编码要比Huffman编码表现得更好。
然而,它却也比其它技术复杂得多。
算术编码不像熵编码把字符概率构建成一棵树,算术编码把输入转化为一个0到1之间的有理数,输入字符的个数记为基底,里面每一个不同的字符都分配一个零到基底之间的值。
然后,最后转化为二进制得到最终的结果。
结果也可以通过把基底恢复为原来的基底值,替换为对应字符而得到原输入值。
2.3游程编码算法
游程编码是一个非常简单的压缩技术,把重复出现的多个字符替换为重复次数外加字符。
单个字符次数为1。
游程编码非常适合数据重复度比较高的数据,同一行有很多像素颜色相同的渐进图片,也可以结合BWT等其它技术一起使用。
BWT算法是1994年发明的技术,目的是可逆的处理一段输入数据,使得相同字符连续出现的次数最大化。
BWT自身并不做任何的压缩操作,仅简单地转化数据,让游程编码压缩算法可以更有效的编码。
BWT算法的步骤:
1.创建一个字符串数组。
2.把输入字符串的所有排列组合塞入上述字符串数组。
3.按照字符顺序为字符串数组排序。
4.返回数组的最后一列。
2.4字典压缩算法
字典压缩算法中最早的算法是LZ77算法。
LZ77算法发表于1977年,是名副其实的字典压缩算法开山之作,相较于当时的几个主要压缩算法,压缩比都有非常明显的提高。
但是LZ77还是使用窗口方法生成字典。
LZ78于1978年由Lempel和Ziv发明,缩写正是来源于此。
不再使用窗口方法来生成字典,输入数据要么被预处理之后用来生成字典,或者字典在文件解析过程中逐渐形成。
LZ78采用了后者。
字典的大小通常被限定为几兆的大小,或者所有编码上限为几个比特,比如8个。
这是出于减少对内存要求的考量。
算法如何处理正是LZ78的各个衍生算法的区别所在。
但是LZ78有版权的限制,所开发的软件大都是收费软件因此采用这种方法的软件并没有很流行。
LZ78算法解析文件的时候,把新碰到的字符或者字符串加到字典中。
针对每一个符号,形如字典索引以及未出现在字典中的符号的字典记录会对应地生成。
如果符号已经存在于字典中,那么将从字典中搜索该符号的子字符串以及其后的其它符号。
最长子串的位置即为字典索引。
字典索引对应的数据被设置为最后一个未知子串。
如果当前字符是未知的,那么字典索引设置为0,表示它是单字符对。
这些数据对形成一个链表数据结构。
这样就是字典的形成过程以及数据结构。
其他算法过程和LZ77算法类似。
字典压缩算法在此之后就迅速流行起来,依据LZ77以及LZ78算法为模板,很多字典压缩算法被开发出来,同时字典压缩算法也成为了当今最主流的压缩算法。
在此之后,陆续出现了LZR算法、DEFLATE/DEFLATE64算法、LZSS算法、LZH算法、LZB算法、ROLZ算法、LZP算法、LZRW1算法、LZJB算法、LZS算法、LZX算法、LZO算法、LZMA/LZMA2算法、LZMW算法、LZW算法以及LZJ算法等算法。
2.5当前常用的压缩算法
基于DEFLATE算法的gzip格式,同时使用了LZ77算法与Huffman编码算法的一个无损数据压缩算法。
除了用于PNG和ZIP格式之外,DEFLATE算法也被频繁的用在其它地方。
例如gzip(.gz)文件格式也使用DEFLATE,gzip是ZIP的一个开源版本。
其它还包括HTTP,SSL,以及其它的高效压缩网络传输数据的技术[2]。
LZMA以及LZMA2这两种算法基本上和LZ77算法是相同的,只不过它操作的是面向比特级别,而非传统上的面向字节级别,用于解析数据。
LZMA2优化了多线程的调度,优化了算法的执行速度,并且在压缩效果上有一定程度的提升[2]。
PAQ于2002年由MattMahoney发明,是老版PPM的一个改进版。
改进的方法是使用一项叫做contextmixing的革命性技术。
Contextmixing是指智能地结合多个(PPM是单个模型)统计模型,来做出对下一个符号的更好预测,比其中的任何一个模型都要好。
这也使得PAQ算法是当前压缩比最高的算法[2]。
bzip2是BWT算法的一个开源实现。
它的操作原理很简单,不过却在压缩比和速度之间达到了一个平衡。
首先,使用了一个游程编码器,接下来,BWT算法加入进来,然后,使用BWT算法中的转移方法以达到产生大量相同符号的目标,为接下来的另一个游程编码算法做准备。
最后结果用Huffman编码,将一个消息头与其打包[3]。
第三章7-ZIP软件工作流程
3.1工作流程
在7z的压缩过程中,一个非常核心的概念就是coder。
一个coder代表一个算法,通常是指一个压缩或解压算法(也包括过滤算法和加密算法等)。
例如,在7z中LZMA算法就是一个coder,DEFLATE算法也是一个coder。
7z中用于加密的AES256算法也是一个coder。
其处理方法如图1:
图1
这就是单独的一个coder的工作流程,其中文件流的生成是由7-ZIP软件在预先就已经做好了的。
通常来讲,一个coder只能处理一个输入流,并且只有一个输出流。
比如把一个文件流压缩成一个输出流。
但是,7z中有的coder可以把一个输入流处理成多个输出流,反过来也可以把多个流处理成一个流。
比如7z的BCJ2coder,它是一个过滤coder,可以把一个exe文件过滤成四个输出流。
这样的话,7z的coder概念得到了扩展。
就是可能同时处理多个输入流,并且可能输出多个流:
图2
下面就介绍7-ZIP软件的具体工作流程了(以LZMA算法为例):
1.将文件流交给LZMA算法进行压缩,如图3:
图3
2.多个coder进行级联,由熵理论,多个压缩coder级联是没有意义的,这样不会大幅提高压缩率,反而会增加计算成本,通常coder的级联是与加密coder进行的级联,如图4所示:
图4
这样,一次完整的7-ZIP软件按的压缩过程就已经结束了。
对于解压来所,是压缩过程的一个逆过程。
3.2Floder概念
实际上,7z概念上最小的压缩单位不是文件,而是FOLDER,它会先把所有的文件都归到一个相应的FOLDER中,然后让这个FOLDER作为文件流,流过若干个Coder。
对于7-ZIP中的FOLDER要特别注意,它不是我们通常指的文件夹。
它也不是任何物理上存在的东西。
7z在开始压缩之前,会把文件分类,大体上是按文件类型以及文件是否需要加密来分类的。
比如说,把所有的exe文件分成一类(一个FOLDER),或者把所有需要加密的文件分在一起。
这个分类方法并不重要,用户可以自己定义FOLDER的分类方法,7z的实现用的方法比较简单。
用户可以给每个文件划分成一个FOLDER。
假设有五个文件a.exe、b.exe、c.dll、a.txt、b.txt需要压缩,具体的压缩流程如图5所示:
图5
其压缩流程主要分为两步:
1.首先,通过一定的分组方法,我们分成了两个FOLDER,第一个FOLDER包括:
a.exe,b.exe和c.dll三个文件。
第二个FOLDER包括:
a.txt和b.txt。
2.对FOLDER1来说,它包含三个文件,FOLDER1就简单的把三个文件串联起来,当做一个大文件,作为输入流i1给Coder1用。
后面的过程就就是上面的图5的内容了。
3.27z文件格式解析
7z文件的总体结构,总共分为了三个部分。
首先是前文件头;然后是压缩数据;最后是尾文件头。
具体格式如图6所示:
图6
首先是前文件头,前文件头是32个字节定长的。
前文件头其实记录的信息很少,它的主要目的是记录尾文件头的位置,压缩信息的主要结构都是存在尾文件头中。
前文件头开头是固定的6个字节的值,前两个字节的值是字母'7'和'z'的ascii值。
后面四个字节是固定的:
0xbc,0xaf,0x27,0x1c。
然后是两个字节的版本号,之后是四个字节的UINT32的值,对于这四个字节来说,由于7z的所有数据都是采用小端在前的存储,所以这四个字节的实际存储顺序是低位字节在前面,高位字节在后。
后面的所有数据都是这种结构,所以以后就不再强调了。
这4个字节是剩下的20个字节的CRC校验值。
最后这20个字节,先是8个字节的UINT64的值,它记录的是尾文件头与前文件头的距离,这个距离是不算前面这32个字节头的,也就是抛开前面32个字节开始计数的(7-ZIP软件通过读取这个值,然后从第33个字节开始直接跳过这个距离,就可以找到尾文件头了)。
然后是8个字节的值,记录了尾文件头的大小(解压的时候,通过这个值就能读出尾文件头的长度了)。
最后还有4个字节的值,它也是一个Crc校验值,是整个尾文件头的校验值。
压缩数据就是数据流压缩过后的FOLDER的数据。
7-ZIP会把文件压缩成若干个包,这里就是按顺序存储这些包的。
每个包的位置和大小信息都会记录在尾文件头中,解压的时候就会从这里读出包,然后解压出来。
尾文件头是7z格式中最重要的部分,其存储了压缩文件每个包的信息,包括采用的压缩算法,加密算法,FOLDER的结构等信息。
对于尾文件头,采用了两种的生成方法。
第一种方法,就是把尾文件头的内容直接写在后面,不做任何处理。
这种方式最简单,但是却最不常用。
因为当用户要压缩大量的文件,尾文件头里面就会有大量的空间用来存储文件名,文件大小,文件时间等等。
通常这些信息很多,而且重复信息特别多。
对于这些简单的文本信息,其可压缩性非常强。
换句话说,这些信息的压缩比比较大。
第二种方法,把原始的尾文件头信息用LZMA算法再压缩一次。
这样可以显著的减少尾文件头的大小,尤其是在大量文件的时候。
其形成的文件如图7所示:
图7
尾文件头压缩的思路,就是把原始的尾文件头数据当做一个单独的文件流来进行一次前面的压缩过程。
就是重复一次前面的7z的压缩过程。
不过这一次只有一个文件,因此只划分一个FOLDER。
而且压缩方法是指定的LZMA。
也就是说只有一个Coder参与。
当然,原始尾文件头的内容可能有敏感信息。
比如里面的文件名等等信息。
因此,7z也提供能力在压缩尾文件头的时候同时加密它。
所以压缩尾文件头的时候如果选择加密头信息,则会加入AES加密。
其具体工作流程如图8所示:
图8
这种处理的优点是,可以直接通过加密的方式把文件结构隐藏,在第三方不知道密码的情况下,如果选择加密文件头,是无法看到整个压缩文件的文件结构的,这一点ZIP是做不到的。
第四章7-ZIP软件实现
4.1新算法的加入
本章主要介绍本人通过查阅相关资料阅读相关代码从而将PAQ算法加入到了7-ZIP软件中去了。
前面已经介绍过了PAQ算法的实现原理了,根据GPL开源协议,PAQ算法是开放源码的。
因此本人将已经开源的PAQ算法的源码加入到了7z-ZIP软件中。
在整体的压缩流程上与原7z-ZIP软件是一样的。
具体测试数据见4.2。
4.2算法加入前后压缩性能的对比
本章将7z-ZIP自带的LZMA算法,PPM算法,BZIP2算法以及后嵌入的PAQ算法对同一文档进行压缩,通过比较其压缩后的大小与压缩前的大小进行比较,可以检测改进的算法在文件压缩中是否有性能提升的作用。
这些软件所选取的测试平台均为Windows732bit,处理器为i72860qm@2.5GHz,内存为2GB。
选取Python27这个包含了很多文件的文档进行压缩,该文档包含4802个文件,205个文件夹,其中大部分是小文档,exe程序。
经过三种压缩算法进行压缩后,得到结果如图9所示。
图10压缩后对比图
具体性能参数如下表2所示:
(压缩率越小表示压缩效果越好)
采用的算法
压缩前文件大小/字节
压缩后文件大小/字节
压缩率
PAQ
70,098,277
19,314,182
0.27553
PPM
70,098,277
22,451,263
0.32028
LZMA
70,098,277
19,411,441
0.27691
BZIP2
70,098,277
23,937,263
0.34148
表2采用不同算法压缩Python27文件夹的性能比较
下面测试视频压缩能力,选择三个mp4视频文件分别进行压缩,并对其性能进行比较,测试结果如图11所示:
图11压缩后对比图
具体性能参数如下所示:
(压缩率越小表示压缩效果越好)
采用的算法
压缩前文件大小/字节
压缩后文件大小/字节
压缩率
PAQ
521,385,365
519,739,346
0.99684
PPM
521,385,365
520,087,774
0.99751
LZMA
521,385,365
520,087,774
0.99751
BZIP2
521,385,365
520,087,527
0.99751
由此可以看出,无论是对小文件进行打包,还是对大文件进行压缩,经过加入PAQ算法的7z-ZIP在压缩性能上有了较大的提升。
第五章结论
经过将近两个月的源码阅读与源码适配,通过阅读7z-ZIP软件的源码与官方文档,本人理解了压缩软件的工作流程,压缩文件的格式,以及开发压缩文件类软件的基本方法,通过将开源的PAQ算法加入到7z-ZIP中,提高了7z-ZIP软件的工作能力,同时也积累的宝贵的开发经验,为后续的科研工作打下了基础。
参考文献
[1]摘自
[2]摘自
[3]摘自
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息论 论文