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 包含以下内容:
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[**] = { }; // 用于中间过程的内存,原始大小为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[];
char *argvs[];
argvs[] = NULL;
argvs[] = "d";
argvs[] = in_file_name;
argvs[] = out_file_name;
return main2(, argvs, buf);
}
压缩函数只需要将argv[1]=”d”替换成,argv[1]=”e”即可
7-zip 压缩算法及C SDK使用的更多相关文章
- ZIP压缩算法详细分析及解压实例解释
最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...
- atitit.压缩算法 ZLib ,gzip ,zip 最佳实践 java .net php
atitit.压缩算法 ZLib ,gzip ,zip 最佳实践 java .net php 1. 压缩算法的归类::: 纯算法,带归档算法 1 2. zlib(适合字符串压缩) 1 3. gz ...
- Android SDK Android NDK Android Studio 官方下载地址
2016.12 Android Studio Windows Includes Android SDK https://dl.google.com/dl/android/studio/install/ ...
- ubuntu 安装eclipse,adt,android sdk,离线
1.安装jdk 环境变量 $ sudo gedit ~/.bashrc export JAVA_HOME=/usr/local/jdk1.8.0_65export JRE_HOME=${JAVA_HO ...
- Android SDK Tools Platform-tools Build-tools
(1)Android SDK (Android SDK主安装包,包含SDK Manager.AVD Manager.工具包tools,释放后的根文件夹为android-sdk-windows): re ...
- 【Android】Android SDK Manager更新慢/失败的问题
前言:更新下载Intel x86 Atom_64 System Image的时候总是失败,速度只有几KB,我这是10M的网啊. 最后找到一篇日志,解决了这个问题.非常感谢!其参考地址:http://w ...
- Android SDK版本和ADT版本
Android SDK版本和ADT版本 Android早期的版本号有点“混乱”,比如Android 2.2对应的ADT版本为ADT-0.9.9而Android 2.3对应的的ADT版本则突然“跃迁 ...
- Android SDK下载地址
原地址:http://lameck.blog.163.com/blog/static/38811374201262111309677/ Android SDK.ADT.tools等官方下载地址(201 ...
- 【Android 应用开发】Android 开发环境下载地址 -- 百度网盘 adt-bundle android-studio sdk adt 下载
19af543b068bdb7f27787c2bc69aba7f Additional Download (32-, 64-bit) Package r10 STL debug info androi ...
随机推荐
- 分布式缓存技术memcached学习系列(二)——memcached基础命令
上文<linux环境下编译memcahed>介绍了memcahed在linux环境下的安装以及登录,下面介绍memcahed的基本命令的使用. Add 功能:往内存增加一条新的缓存记录 语 ...
- JMeter学习笔记---作用域规则
JMeter测试树中既包含遵循分层规则的测试元件(监听器.配置元件.后置处理器.前置处理器.断言.定时器),又包含遵循顺序规则的测试元件(逻辑控制器.采样器),测试人员创建测试计划的同时,实际上就创建 ...
- Linux vm运行参数 - OOM相关的参数
一.前言 本文是描述Linux virtual memory运行参数的第二篇,主要是讲OOM相关的参数的.为了理解OOM参数,第二章简单的描述什么是OOM.如果这个名词对你毫无压力,你可以直接进入第三 ...
- Python 字典 popitem() 方法
描述 Python 字典 popitem() 方法随机返回并删除字典中的一个键/值对(一般删除末尾对). 如果字典已经为空,却调用了此方法,就报出KeyError异常. 语法 popitem() 方法 ...
- JavaScript使用小技巧
原文:45 Useful JavaScript Tips, Tricks and Best Practices作者:Saad Mousliki 在这篇文章里,我将分享一些JavaScript的技巧.秘 ...
- ipa 发布到stroe
http://my.oschina.net/joanfen/blog/133642 较详细:http://www.techolics.com/apple/20120401_197_2.html
- 在 ASP.NET Web API 中,使用 命名空间(namespace) 来作为路由的参数
这个问题来源于我想在 Web API 中使用相同的控制器名称(Controller)在不同的命名空间下,但是 Web API 的默认 路由(Route) 机制是会忽略命名空间的不同的,如果这样做,会看 ...
- 为debian8.2更换官方源
最近,配置一个韩国vps,里面用的是163的源,感觉不如官方的好用,就改为官方源.地址为:ftp.cn.debian.org 输入命令: vi /etc/apt/sources.list 进入vi编辑 ...
- Lua整理——table库
table属性 table库是有一些辅助函数构成的,这些函数将table作为数组来操作. 当中.有对列表中插入和删除元素的函数,有对数组元素进行排序的函数.还有对链接一个数组中全部字符串的函数. 0. ...
- ny20 吝啬的国度
吝啬的国度 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有 ...