7-zip 压缩算法及C SDK使用

pdf版本下载:https://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: CPP\7zip\UI\Client7z -> client7z.exe

                                                 CPP\7zip\Bundles\Alone7z –> 7zr.exe

                                                 CPP\7zip\Bundles\LzmaCon-> lzma.exe

                                   Linux:    CPP\7zip\Bundles\LzmaCon -> 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”即可

posted on 2014-03-03 16:34  深入浅出eBPF  阅读(18228)  评论(11编辑  收藏  举报

导航