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: 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”即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM