LZMA,(Lempel-Ziv-Markov chain-Algorithm的缩写),是一个Deflate和LZ77
算法改良和优化后的压缩算法,开发者是Igor Pavlov,2001年被首次应用于7-Zip压缩工具中,是 2001年以来得到发展的一个数据压缩算法。它使用类似于 LZ77 的字典编码机制,在一般的情况下压缩率比 bzip2 为高,用于压缩的可变字典最大可达4GB。
简介
C++语言写成的的 LZMA
开放源码压缩库使用了
区间编码支持的 LZ77 改进压缩算法以及特殊的用于
二进制的预处理程序。
数据流、重复序列大小以及重续序列位置单独进行了压缩。
LZMA 支持几种散列链变体、
二叉树以及基数树作为它的字典查找算法基础。
BCJ / BCJ2 二进制文件压缩
BCJ/ BCJ2 压缩工具所附带的 LZMA SDK 包括:在 X86、ARM、PowerPC、IA-64 以及 ARM Thumb 处理器上在压缩之前跳转目标进行归一化处理。对于 x86 平台来说,这是一个近跳转、近调用以及近条件跳转需要从“向后跳 1665
字节”这样的
机器语言归一化到“跳转到 5554”这样的格式,但是短跳转及短条件跳转不需要进行这样的处理。
尽管 7-Zip BCJ2 使用 32 位的偏移地址,但是 UPX 这样的可执行文件压缩工具当检测到 16 位 DOS 二进制文件格式的时候仍然可以使用 16 位的数值。
RAR压缩工具对 32 位的 x86
可执行文件以及 IA64 Itanium 可执行文件进行偏移地址压缩。
BCJ 与 BCJ2 之间的区别在于前者只将近跳转及近调用目标地址转换到归一化的形式,而 BCJ2 只将 x86 平台下的近跳转、近调用及条件近跳转目标分别进行压缩。
技术特点
一些微软Windows专有的特性深深嵌入在
源程序中,这样就很难生成一个与 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,因此二者都不能互相使用对方生成的数据。
在
GNU通用公共许可证下发布的7-zip中使用的LZMA有以下几个特点:
* 高压缩比;
*解压缩时仅需少量内存 (取决于字典大小);
* 可变更字典大小 (最大 4 GB);
* 压缩速度:在一部2GHz的
处理器上运行,约可达到1MB每秒的速度;
*解压缩速度:在一部2GHz的处理器上运行,约可达10-20MB每秒的速度;
* 支持多线程、
多核心(多处理器)和Pentium 4处理器的
超线程(Hyper-Threading);
这个特点使得这个这个算法的解压过程非常适合于嵌入式系统应用的场合。
应用
使用或者支持 LZMA 的软件有:
* Nullsoft Scriptable Install System
* Inno Setup
* AdvancedInstaller
* cramfs and SquashFS, with applied patches
* PyLZMA,Igor Pavlov 的 LZMA SDK 的 Python 语言接口
* FreeArc, 归档工具及 LZMA SDK 的 Haskell 语言接口
* 用于 Pascal 语言的 LZMA SDK