跳至內容

LZMA

出自Taiwan Tongues 台語維基
這是此頁批准,以及是最近的修訂。

LZMA(英語:Lempel–Ziv–Markov chain algorithm)是二空空一年以來得著發展的一个資料壓縮演算法,伊用七-Zip 歸檔工具內底的七 z 格式佮 Unix-like 落來的 xz 格式。伊使用類似 LZ 七十七的字典編碼機制,佇咧一般的情況下壓縮率比 bzip 二為懸,用佇壓縮的字典檔案大細會當達四 GB。

C + + 語言寫成的 LZMA 開放原始碼壓縮庫使用區間編碼支援的 LZ 七十七改進壓縮演算法猶閣有特殊的用佇咧二進位的預處理程式。LZMA 嘿資料流、重複序列大細猶閣再序列位置單獨進行矣壓縮。LZMA 支援幾種雜鬥鏈變體、二樹佮基數樹做為伊的字典走揣演算法基礎。

特性

BCJ / BCJ 二二進位檔案壓縮

BCJ / BCJ 二壓縮工具所附帶的 LZMA SDK 包括講:佇咧 X 八十六、ARM、PowerPC、IA 鋪六十四以及 ARM Thumb 處理器上佇咧壓縮進前跳轉目標進行歸一化處理。對於 x 八十六平台來講,這是一个近跳轉、近呼叫以及近條件跳轉需要對「向後跳一千六百六十五位元組」這款機械語言歸一化到「跳到五千五百五十四」按呢的格式,但是短跳轉佮短條件跳轉無需要進行按呢的處理。

BCJ 佮 BCJ 二之間的區別佇咧前者只將近跳轉佮近呼叫目標位址轉換到歸一化的形式,而且 BCJ 兩隻將 x 八十六平台跤的近跳轉、最近呼叫佮條件近跳轉目標分別進行壓縮。

實現佮會當移植性

一寡仔 Windows 作業系統專有的特性深鬧熱入佇原始的程式內底,會當予阮上頭先足歹生一个佮 Unix 等系統相容的版本。毋過,LZMA 因為其開放原始碼特性,猶原落尾手得著各種平台的實現:

七-Zip / p 七 zip 參考實現

佇咧 GNU 通用公共許可證下發佈的七-zip 參考版本有以下的幾个特點:

  • 高壓縮比
  • 解壓縮程式碼較細:大約五 KB
  • 解壓縮的時陣需要少量記憶體(攏著愛看字典大細)
  • 解壓縮速度:佇一部二 GHz 處理器上運行,大約是會當到十二十 MB 每秒的速度。
  • 支援佇多核心系統上濟執行緒執行(包括超執行緒)。

這个特點予得這个這个演算法的敨壓過程去誠適合佇1875入式系統應用的場合。p 七 zip 為七-zip 的 POSIX 系統徙栽。

xz 和 LZMA Unix Port

LZMA Unix Port 是一个干焦徙七位矣-zip 中 LZMA 壓縮代碼的版本,內底和命令列參數類似 gzip 的較早資料流的壓縮工具。伊毋是一个歸檔工具,干焦是一个普通的壓縮工具,並且因為伊佇無資料內底無壓縮檔案大細的 UInt 六十四變數,所以伊佮七-zip 生成的 LZMA 資料流內底無仝。七-zip 使用一種閣較靈活的歸檔格式七 z,因為按呢袂使予人解壓。

尾仔類似的 xz 代替矣 LZMA Unix Port,提供閣較好的壓縮功能,並且最後用其他的效能佮壓縮比成做袂少開源軟體(比如講 Linux 核心原始碼、Debian deb 和 Fedora rpm)的壓縮方式之一,甚至是預設壓縮方式。xz 號令列程式捌有過一个號名 pxz 的分支,提供加執行緒壓縮功能,後來 xz 佇五榖二時本身就直接提供濟執行緒矣。

lzip

Lzip 是另外一个 Unix-like 系統下的 LZMA 壓縮格式,其主要目的之一就是佮 xz 競爭。佮 xz 相比並,伊的上大的光點佇提供閣較簡單的檔案格式佮因此得來的閣較方便的資料恢復。Lzip 的格式按呢簡單以至於文件中就存在一个解壓器實現,就算講未來的資料考古學家就算講佇咧量電腦予得 LZMA 無路用多時了後干焦靠文件嘛會當成功解壓檔案。

應用

使用抑是支援 LZMA 的軟體有:

  • Nullsoft Scriptable Install System
  • Inno Setup
  • Linux 核心(cramfs、SquashFS、initrd 等)、 GRUB
  • lrzip(" long range zip " , or " LZMA rzip ")
  • PyLZMA,Igor Pavlov 的 LZMA SDK 的 Python 語言介面
  • FreeArc,歸檔工具佮 LZMA SDK 的 Haskell 語言介面
  • 用佇咧 Pascal 語言的 LZMA SDK
  • 七-Zip
  • osu ! ( 用佇記錄𨑨迌的倒轉來,osu ! 將游標移動資訊以 LZMA 格式壓縮做存檔。)

壓縮格式表示

LZMA 的壓縮輸出流是一个位元流,是用自適應兩進位行程編碼器(adaptive binary range coder)。 位元流劃分做包(packet), 逐个包或者表示一个位元組的被壓縮資料,或者是親像 LZ 七十七的壓縮輸出序列彼款的長度佮距離的著(pair)。 逐个包著逐个部份做為獨立的頂下文(context), 對每一个位元的概率預測干焦有關於前一个包的同類型位元值。

有七類包:

LONGREP [\ *] 表示 LONGREP [空吱三] 四種包,\ * REP 指稱 LONGREP 佮 SHORTREP , \ * MATCH 指稱 MATCH 抑是 \ * REP .

LONGREP [n] 包刪除了對距離的直接表示,是使用包序列上近四个距離。


包的長度部份表示如下:

如同 LZ 七十七 , 伊這長度無一定愛小於距離。

距離佇邏輯上是三十二位元,距離空表示最近增加到詞典的彼个位元組。

距離的編碼以六位元 " distance slot " 開始,由此會當知影後壁綴偌濟位元來補全。這會當變長編碼。 距離解碼了後為位元流,對上厲害的位到上無顯示。distance slots 零 − 三直接編碼矣零 − 三 .

解壓縮演算法咧講

依照1875入去到 Linux kernel 的 XZ 解碼演算法原始檔。

參考資料

外部連結

  • 七-Zip Official Web-Site
  • LZMA SDK
  • p 七 zip Unix port of command-line utilities
  • PyLZMA Python Wrapper
  • Nullsoft Installer uses LZMA
  • Inno Setup supports LZMA
  • Compress home page
  • LZMA support for cramfs filesystem(dead)
  • LZMA utils
  • FreeArc archiver and Haskell interface to the LZMA library
  • at least one perl interface to LZMA library has been published
  • Pascal port of the LZMA SDK