2010-06-07 256 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