LZMA SDK
From: xuyibo.org Date: 2021-01-29 09:18 AM摘自:https://unknown-error.spaces.live.com/Blog/cns!9B12A9BDE11A3428!329.entry
LZMA 是 7-Zip 程序中 7z 格式 的默认压缩算法。LZMA 能提供给用户极高的压缩比及较快的压缩速度,它非常适合与应用程序集成。
LZMA 软件开发工具包 (以下简称 SDK) 给开发客户提供文档、源代码以及几个使用 LZMA 压缩算法制作的应用程序的例子。我下载到的文件名是lzma457.tar.bz2。
假设压缩包解压在C:\lzma457\下,则用vc(我用的是vc2005)打开位于C:\lzma457\CPP\7zip\Compress\LZMA_Alone\下的工程文件,编译即可得到可执行文件lzma.exe,提醒一下,该文件的默认路径在C:\util。在linux下,则只需要到相应LZMA_Alone目录下执行make –f makefile.gcc即可得到可执行文件lzma。
该程序包括压缩和解压两部分功能。简单说明为:
Usage: LZMA inputFile outputFile
e: encode file
d: decode file
下面讨论如何将解压代码集成到自己的程序中,最简单的方式是使用C:\lzma457\C\Compress\Lzma目录下的三个文件:
LzmaDecode.c
LzmaDecode.h
LzmaTypes.h
该目录下的LzmaTest.c演示了如何使用解压函数。可以跟一下这两个c文件编译链接后得到的可执行码。
以下是一个使用解压函数的简单例子(不支持超过4G数据量的情况):
const unsigned char* originalStream是待解压数据
uint32 size是待解压数据的大小(in byte)
/* Read LZMA properties for compressed stream */
const unsigned char* properties = originalStream;
/* Decode LZMA properties and allocate memory */
CLzmaDecoderState state;
LzmaDecodeProperties(&state.Properties;, properties, LZMA_PROPERTIES_SIZE);
state.Probs = (CProb *)malloc(LzmaGetNumProbs(&state.Properties;) * sizeof(CProb));
/* Read uncompressed size */
uint32 outSize = 0;
for (int i = 0; i < 8; i++)
{
unsigned char b = originalStream [LZMA_PROPERTIES_SIZE + i];
outSize += (b) << (i * 8);
}
unsigned char *outStream = (unsigned char *)malloc(outSize);
uint32 compressedSize = size – (LZMA_PROPERTIES_SIZE + 8);
const unsigned char *inStream = &( originalStream[LZMA_PROPERTIES_SIZE + 8]);
uint32 inProcessed = 0;
uint32 outProcessed = 0;
int res = LzmaDecode(&state;, inStream, compressedSize, &inProcessed;, outStream, outSize, &outProcessed;);
———————
补充一些摘录的资料:
LZMA ,ppm,lzss,lz77。。。。这些都是一种算法的名字
zlib,range coder。。。。这些是压缩库的名字
7z,winzip,winrar。。。。这些都是archive工具
压缩库内部通常是集中了几种算法在里面,有机的组合起来形成一组可以方便使用的api。因为每一种算法都有它最适用的场合,将集中算法组合起来是一种更有效率的方式。
archive工具更倾向的是一种解压和压缩成文件的工具,其内部核心也像压缩库那样内藏了一些复合的压缩算法
可以说算法库是综合多种压缩算法而精炼出的一种压缩方式,而archive工具就是使用一种或多种算法库的应用程序;算法库更偏向sdk和接口的东西,而archive工具更偏向用户使用(比如设置密码,压缩等级,算法选择,对其他压缩格式的支持等)
zlib和LZMA都是LZ系字典压缩算法+其它编码的组合性无损压缩算法。前者的压缩算法称为deflate算法,基于改进的LZ77+Huffman编码;后者同样是基于LZ77,但做了别的方面的改进,例如使用非常大的字典来强行提高压缩比,因此消耗资源比较多。LZ系的压缩算法追溯到源头基本上都是基于LZ77/LZSS或LZ78/LZW。
PPM是一种基于Markov模型的预测性压缩方式,通过前面处理的数据来预测接下来的字符的概率。这种技巧可以跟BWT、MTF以及LZ系之类的压缩算法一起用。