zoukankan      html  css  js  c++  java
  • 7-zip 压缩算法及C SDK使用

    pdf版本下载:http://files.cnblogs.com/davad/7-zip_and_SDK.pdf 

    1. 介绍

    官方网址:中文:http://sparanoid.com/lab/7z/ 英文:http://www.7-zip.org/

    SDK下载网址:中文:http://sparanoid.com/lab/7z/ 英文:http://www.7-zip.org/sdk.html

    SDK开发支持语言:Java C/C++ C#

    缺点:LZMA SDK相关文档不完整.

    7-zip当前最新稳定版本为:7-Zip 9.20稳定版,最后更新时间为:2010-11-18

    7-zip当前最新版本为:7-Zip 9.32 alpha,最后更新时间为:2013-12-01

    7z 是一种全新的压缩格式,它拥有极高的压缩比。7z 格式的主要特征:

    l  开放的结构

    l  高压缩比

    l  强大的 AES-256 加密

    l  能够兼容任意压缩、转换、加密算法

    l  最高支持 16000000000 GB 的文件压缩

    l  以 Unicode 为标准的文件名

    l  支持固实压缩

    l  支持文件头压缩

    7z 已公开了结构编辑功能,所以它可以支持任何一种新的压缩算法。到目前为止,下列压缩算法已被整合到了 7z 中:

    压缩算法

    备注

    LZMA

    改良与优化后的   LZ77 算法

    LZMA2

    改良的   LZMA 算法

    PPMD

    基于   Dmitry Shkarin 的   PPMdH 算法

    BCJ

    32 位 x86   可执行文件转换程序

    BCJ2

    32 位 x86   可执行文件转换程序

    BZip2

    标准 BWT   算法

    Deflate

    标准   LZ77-based 算法

    LZMA 算法是 7z 格式的默认算法。LZMA 算法具有以下主要特征:

    l  高压缩比

    l  可变字典大小(最大 4 GB)

    l  压缩速度:运行于 2 GHz 的处理器可达到 1 MB/秒

    l  解压缩速度:运行于 2 GHz 的处理器可达到 10-20 MB/秒

    l  较小的解压缩内存需求(取决于字典大小)

    l  较小的解压缩代码:约 5 KB

    l  支持 Pentium 4 的超线程(Hyper-Threading)技术及多处理器

    LZMA 压缩算法非常适于应用程序的内嵌。LZMA 发布于 GNU LGPL 许可协议之下,如果您想使用 LZMA 的代码,您可以通过 发送信息到 LZMA 开发部 来咨询和自定义设计代码及制定开发者的使用许可。您也可以点击此处来查看有关 LZMA SDK 的信息: LZMA SDK.

    7z 是 7-Zip 发布于 GNU LGPL 许可下的子程序。您可从 下载页面 下载 7-Zip 的源代码。

    支持 7z 压缩格式的应用程序:WinRAR、PowerArchiver、TUGZip、IZArc。

    2 LZMA SDK介绍

    SDK下载网址:中文:http://sparanoid.com/lab/7z/ 英文:http://www.7-zip.org/sdk.html

    SDK开发支持语言:Java C/C++ C#

    9.20版本下载地址:http://downloads.sourceforge.net/sevenzip/lzma920.tar.bz2,新增用于安装包的精简版 SFX 自释放模块。

    3. LZMA SDK代码分布

    下载lzma920.tar.bz2后,解压目录如下:

                               

    LZMA SDK 包含以下内容:

    C++ source code of LZMA Encoder and Decoder

    C++ source code for .7z compression and decompression (reduced version)

    ANSI-C compatible source code for LZMA / LZMA2 / XZ compression and decompression

    ANSI-C compatible source code for 7z decompression with example

    C# source code for LZMA compression and decompression

    Java source code for LZMA compression and decompression

    lzma.exe for .lzma compression and decompression

    7zr.exe to work with 7z archives (reduced version of 7z.exe from 7-Zip)

    ANSI-C and C++ source code in LZMA SDK is subset of source code of 7-Zip.

    ANSI-C LZMA 解压缩代码是从原始的 C++ 源代码转换到 C。并简化和优化了代码的大小。但它依然和 7-Zip 的 LZMA 完全兼容。

    C目录:

    Util和相对应的文件。

    Util目录内容如下:

     

    目录名                                    说明                      支持平台

    7z                              生成可执行程序7z          Linux/Windows

    Lzma                         生成可执行程序lzma        Linux/Windows

    LzmaLib                  生成LZMA.dll动态库          Windows

    SfxSetup                 生成可执行程序7zS2.sfx     Windows

    CPP目录内容如下:

     

    目录名                                          说明                             支持平台

    7z                                         生成可执行程序7z           Linux/Windows

                                       Windows: CPP7zipUIClient7z -> client7z.exe

                                                     CPP7zipBundlesAlone7z –> 7zr.exe

                                                     CPP7zipBundlesLzmaCon-> lzma.exe

                                       Linux:    CPP7zipBundlesLzmaCon -> lzma

     

    Common                       公共包含的文件             Linux/Windows

    Windows                 Windows平台下包含的文件    Windows

    Java目录

    主要包含7zip.jar和使用的Java源代码

    结论:对于Linux下程序集成开发采用C语言SDK更加方便。

    4. 使用LZMA C SDK

    C版本SDK已经实现了针对输入文件压缩和解压缩的功能,具体功能在:

    C/Util/Lzma/LzmaUtil.c中的main2函数中实现,可以从main函数中直接调用。

    int main2(int numArgs, const char *args[], char *rs)

    实现lzma程序的main函数如下:

    int MY_CDECL main(int numArgs, const char *args[])
    
    {
    
      char rs[10*1024*1024] = { 0 };       // 用于中间过程的内存,原始大小为80K
    
      int res = main2(numArgs, args, rs);
    
      fputs(rs, stdout);
    
      return res;
    
    }

    对于lzma程序来讲,使用帮助如下:

    lzma <e|d> inputFile outputFile

                 e: encode file

                 d: decode file

    因此如果使用文件解压缩的话,只需要将LzmaUtil.c中的main函数使用宏定义控制,将相关文件编译成动态库使用即可。

    例如解压缩函数可定义如下:

    int decode_file(const char *in_file_name, const char* out_file_name)
    
    {
    
             char buf[800];
    
             char *argvs[4];
    
             argvs[0] = NULL;
    
             argvs[1] = "d";
    
             argvs[2] = in_file_name;          
    
             argvs[3] = out_file_name;                
    
             return main2(4, argvs, buf);
    
    }

    压缩函数只需要将argv[1]=”d”替换成,argv[1]=”e”即可

  • 相关阅读:
    list 集合工具类
    Java获取当前系统时间的前N小时时间
    注意点
    小bug
    Linux常用命令
    MySql的执行计划
    【解决问题】引入.vmx文件后,xshell连接Could not connect to ‘192.168.211.132‘ (port 22): Connection failed
    星涛:javaEE学习路线一览
    Vue响应式原理
    Java操作Xml文件
  • 原文地址:https://www.cnblogs.com/davad/p/3578628.html
Copyright © 2011-2022 走看看