2010-06-07 218 views
6

我需要知道LZMA壓縮算法的細節。我知道它的一般概念,但我需要一些例子詳細解釋它。任何人都可以幫助我獲得更多信息嗎?LZMA壓縮方法如何工作?

謝謝。

+8

http://www.google.com/search?q=LZMA+compression+algorithm – BenV 2010-06-07 15:50:06

+0

謝謝BenV, 其實我知道它的一般概念,我需要更多的細節和一些例子。 謝謝。 – Shadi 2010-06-07 16:00:01

+1

重寫問題,陳述你所知道的(可能在哪裏),並提出有關細節的問題。 – Unreason 2010-06-07 16:37:20

回答

3

嘗試LZMA SDK。它「提供了文檔,樣本,頭文件,庫和工具,您需要開發使用LZMA壓縮的應用程序。」

+0

你可以告訴我們如何使用這個SDK – 2016-02-02 16:26:33

+0

@Frankenstein下載SDK,查看文檔和示例,試用一下,然後如果你有特定的問題回來並且在StackOverflow上詢問它們。 – BenV 2016-02-02 20:18:04

+0

在DOC ==> 7cC.txt中:有一些名爲'7zMain.c'的測試應用程序,但sdk文件夾中沒有這樣的文件...但cmd中的命令7z.exe或7z也不起作用! !你能幫助...謝謝 – 2016-02-02 22:32:21

1

下面是簡要說明:

LZMA是由伊戈爾巴甫洛夫,它結合了一個LZ77壓縮和範圍編碼發明了一種壓縮格式。

隨着LZ77,想象你正在複製一個字符的文字,但要採取一些快捷方式。您可以發送單個字符或一對數字(距離,長度),意思是「請複製'長度'字符,從複製文本中的'距離'字符開始,從光標現在的位置開始。而已!

範圍編碼是一種壓縮任何性質的消息的迷人方式。假設你想發送一個非常大的數字N,但數字較少。這是可能的 - 如果一些數字(0到9)更頻繁地出現,並且更少出現。該方法如下。 您以範圍開頭,例如[0,999 [。 您可以將其細分爲10個間隔(對應於數字0到9),並根據它們的出現概率p0 .. p9進行校準。 N的第一個數字可能是3,其相應的間隔是[295,405 [。 然後,通過細分[295,405 [以十個間隔分隔]繼續第二位數字。如果第二個數字是0,那麼你現在可能已經[295,306 [,表示部分消息「30」。當然,你會發現,如果你想堅持使用整數(無論如何計算機都沒有無限精度),那麼當你設置10個概率爲p0 .. p9的時間間隔時,就會很快失去精度。解決方法是在寬度太小時不時追加0到間隔。因此,如果您決定每次寬度小於100時乘以10,則「30」的間隔現在爲[2950,3060 [。 稍後需要對n個數字進行編碼(在n個細分和一些x10需要的時候),你的間隔可能看起來像[298056312,298056701 [。邊界變得越來越大 - 第二個問題。解決方案:你看到最左邊的數字不會再改變。您可以擺脫它們並將它們作爲壓縮消息的一部分發送出去。 這就是基本範圍編碼的工作原理。 然後,一個有趣的事情是,你可以編碼混合不同的字母(數字'0'到'9'和字母'A'到'Z')甚至相同的字母表,但根據上下文具有不同的概率,只要解碼器知道什麼時候使用。這就是範圍編碼。

LZMA專門用於一個單一的二進制字母(0和1),所以範圍總是分爲兩部分。但它適用於很多情境概率。藉助一些參數,您可以在模型中擁有數百萬個不同的概率!概率是事先不知道的,所以在這方面LZMA是一種純粹的自適應方法:編碼器和解碼器在符號被髮送和接收時調整概率。在每個比特被編碼,發送,解碼之後,整個概率集合(並且必須)恰好處於由編碼器和解碼器處於相同狀態。

(複製從這裏:http://gautiersblog.blogspot.ch/2016/08/lzma-compression.html

相關文章提到的編碼器是可見@https://sourceforge.net/p/unzip-ada/code/HEAD/tree/zip_lib/lzma-encoding.adb

+0

只有鏈接的答案可能會失效,如果鏈接地址更改..... – Rupsingh 2016-08-22 13:11:50

+0

更好的是這樣的:-)? – Zerte 2016-08-22 13:24:52

+1

嘗試簡要回答,然後提供參考,而不是盲目地應對某些事情.... – Rupsingh 2016-08-22 13:29:06