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系之类的压缩算法一起用。

    EMail: * 如果为有效的邮箱地址,将自动发送站长回复

网站地图