7zip与lzma
2012-09-21 14:50:29

7-Zip是一个开放源码的数据压缩程序,主要用在Microsoft Windows操作系统,Unix-like的操作系统如Linux与FreeBSD下面有7-zip的移植版本p7zip可以使用。它提供命令行接口的程序或图形用户界面的程序,而且可以与资源管理器结合。7-Zip是自由软件,由Igor Pavlov于1999年开始发展,并把主体在GNU LGPL协议下发布,加密部份使用AES的代码,使用BSD license发布,解压RAR部分使用RAR特定的许可协议。

7-Zip目前在市场上主要的竞争对手是WinZip以及WinRAR,这两者都是专利软件。7-Zip也是目前最普及的开放源代码压缩程序,在2007年获得SourceForge.net的社区票选为"最佳技术设计"及"最佳项目"两个奖项。

7-Zip预设的格式是其自行开发的7z格式,扩展名为.7z。7z格式包含多种算法,最常使用的就是Bzip2以及作者Igor Pavlov开发的LZMA。LZMA算法比起其他常见的传统压缩算法,如Zip、RAR来说相对较新,压缩率也比较高。7z格式本地的使用Unicode来存储文件名称,可以避免不同系统间压缩解压乱码的问题。目前流行的压缩程序大多支持此功能,如WinRAR、7-Zip、Peazip. 7z压缩格式支持Unicode.

其他支持的格式及运算方式
7-Zip支持众多的压缩/未压缩的文件格式,包含ZIP,微软软件包装CAB、RAR、ARJ、Z、gzip、bzip2、LLHA、tar、cpio、rpm。从4.42版开始支持CD/DVD镜像文件格式ISO,另外因为授权问题,不再支持ACE格式. 从7-Zip 9.14测试版, 7-Zip可以看和打开VHD虚拟硬盘.

7-Zip支持众多的功能,
* 对于7z格式的压缩文件,7-Zip支持256-bitAES加密
* 7-Zip有弹性地支持动态文件大小压缩,应对备份至移动媒体如CD与DVD十分有效
* 支持FAR Manager插件
* 支持79种语言(含英文、中文(简体、正体)、日文、韩文)
* 相对于需付费的WinRAR、WinZip,7-Zip提供免费且强大的压缩/解压缩能力
* 支持多线程压缩与解压缩
* 7-Zip有能力创建自解压缩档(SFX)
* 7-Zip有能力解压缩错误文件名的压缩档,必要时,可以重命名文件

版本号的变化
从 4.65 版本之后,7-Zip采用了与Ubuntu等一些项目的相同做法。改为使用年份来增加版本号,第一个使用新版本号发行的版本为9.07 beta
2010年11月8日后,7-Zip版本号为9.20。

p7zip
CLI版本为p7zip,为跨平台版本,并不是同一个人维护。

LZMA
LZMA(Lempel-Ziv-Markov chain-Algorithm的缩写)是2001年以来得到发展的一个数据压缩算法,它用于7-Zip归档工具中的7z格式。它使用类似于LZ77的字典编码机制,在一般的情况下压缩率比bzip2为高,用于压缩的字典文件大小可达4GB。

C++语言写成的的LZMA开放源码压缩库使用了区间编码支持的LZ77改进压缩算法以及特殊的用于二进制的预处理程序。
数据流、重复串行大小以及重续串行位置单独进行了压缩。
LZMA支持几种散列链变体、二叉树以及基数树作为它的字典查找算法基础。

BCJ / BCJ2二进制文件压缩
BCJ / BCJ2压缩工具所附带的LZMA SDK包括:在X86、ARM、PowerPC、IA-64以及ARM Thumb处理器上在压缩之前跳转目标进行归一化处理。对于x86平台来说,这是一个近跳转、近调用以及近条件跳转需要从“向后跳1665字节”这样的机器语言归一化到“跳转到5554”这样的格式,但是短跳转及短条件跳转不需要进行这样的处理。

BCJ与BCJ2之间的区别在于前者只将近跳转及近调用目标地址转换到归一化的形式,而BCJ2只将x86平台下的近跳转、近调用及条件近跳转目标分别进行压缩。

7-Zip实现
在GNU通用公共许可证下发布的7-zip参考版本有以下几个特点:
* 高压缩比
* 解压缩代码较小:约5 KB
* 解压缩时仅需少量存储器(取决于字典大小)
* 解压缩速度:在一部2GHz的处理器上运行,约可达10-20MB每秒的速度。
* 支持多线程、多核心和Pentium 4处理器的超线程。

这个特点使得这个这个算法的解压过程非常适合于嵌入式系统应用的场合。

一些微软视窗专有的特性深深嵌入在源程序中,这样就很难生成一个与Unix兼容的版本。但是,已经有两个移植到类Unix平台的版本:
* p7zip是一个或多或少地完全将7z及7za移植到POSIX的7-zip 版本,这些系统包括Linux、Solaris、OpenBSD、FreeBSD、Cygwin等Unix系统以及Mac OS X和BeOS等。

* LZMA Unix Port是一个只移植了LZMA中代码的版本,它是一个类似于gzip的基于数据流的压缩工具。它不是一个归档工具,而只是一个普通的压缩工具,并且由于它在没有数据头中没有未压缩文件大小的UInt64变量,所以它与7-zip生成的LZMA数据流中不同。7-zip使用一种更加灵活的归档格式7z,因此二者都不能互相使用对方生成的数据,至少在目前是这样。