簡介
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有以下幾個特點:
* 高壓縮比;
*解壓縮代碼較小:約 5 KB;
*解壓縮時僅需少量記憶體 (取決於字典大小);
* 可變更字典大小 (最大 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
* lrzip ("long range zip", or "LZMA rzip")
* PyLZMA,Igor Pavlov 的 LZMA SDK 的 Python 語言接口
* FreeArc, 歸檔工具及 LZMA SDK 的 Haskell 語言接口
* 用於 Pascal 語言的 LZMA SDK