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

简介: 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 包含以下内容:

l  C++ source code of LZMA Encoder and Decoder

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

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

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

l  C# source code for LZMA compression and decompression

l  Java source code for LZMA compression and decompression

l  lzma.exe for .lzma compression and decompression

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

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

目录
相关文章
|
6月前
|
算法 测试技术 C++
【动态规划】【状态压缩】【C++算法】1815 得到新鲜甜甜圈的最多组数
【动态规划】【状态压缩】【C++算法】1815 得到新鲜甜甜圈的最多组数
|
6月前
|
算法 JavaScript Java
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
|
6月前
|
算法 测试技术 C#
【状态压缩】【动态规划】【C++算法】691贴纸拼词
【状态压缩】【动态规划】【C++算法】691贴纸拼词
|
18天前
|
存储 JSON 算法
TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案
在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。
27 0
|
4月前
|
算法 Java
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
57 1
|
4月前
|
算法 Java 程序员
Java面试题:解释Java的垃圾回收机制,包括常见的垃圾回收算法。介绍一下Java的垃圾回收算法中的标记-压缩算法。
Java面试题:解释Java的垃圾回收机制,包括常见的垃圾回收算法。介绍一下Java的垃圾回收算法中的标记-压缩算法。
48 0
|
6月前
|
存储 编解码 算法
图像的压缩算法--尺寸压缩、格式压缩和品质压缩
图像的压缩算法--尺寸压缩、格式压缩和品质压缩
115 0
|
6月前
|
机器学习/深度学习 人工智能 算法
【图像版权】论文阅读:CRMW 图像隐写术+压缩算法
【图像版权】论文阅读:CRMW 图像隐写术+压缩算法
51 0
|
6月前
|
机器学习/深度学习 存储 编解码
利用深度学习优化视频压缩算法
【4月更文挑战第28天】随着数字媒体时代的到来,视频数据量急剧增加,有效的视频压缩技术变得尤为重要。本文探讨了一种基于深度学习的视频压缩框架,旨在提高压缩效率同时保持较高的视频质量。通过使用卷积神经网络(CNN)对视频帧进行特征提取,并结合先进的编码技术,本研究提出了一种新的率失真优化算法。实验结果表明,该算法在多个标准测试序列上相比传统方法能显著降低比特率,同时维持了良好的视觉质量。
|
6月前
|
算法 测试技术 C++
【状态压缩】【动态规划】【C++算法】691贴纸拼词
【状态压缩】【动态规划】【C++算法】691贴纸拼词

热门文章

最新文章