c语言lzma算法,C语言编程使用lzma SDK对7z文件简略解压缩
有时候我们只需要单纯对lzma算法压缩的7z文件进行解压,有时需要在嵌入式设备上解压,使用p7zip虽然支持多种格式,但是不容易裁剪,使用lzma SDK是首选:
可以在这里找到各种版本:http://zh.sourceforge.jp/projects/sfnet_sevenzip/releases/
我下载了4.65版本,这个对文件名编码支持没有9.20的好,中文可能有问题,但是我的需求不需要支持中文文件名,所以足够用了。
解压后先看一下7z这个工程,这个示例只有文件解压操作,仿照就可以写一个更加精简的解压函数:
需要的文件可以参考实例:
修改7zMain.c即可
我们的目的是写一个函数extract7z,接收参数是7z文件路径,输出文件路径,便可执行全部解压
主要调用函数:
SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, ISzAlloc *allocMain, ISzAlloc *allocTemp);
SRes SzAr_Extract(
const CSzArEx *p,
ILookInStream *inStream,
UInt32 fileIndex,
UInt32 *blockIndex,
Byte **outBuffer,
size_t *outBufferSize,
size_t *offset,
size_t *outSizeProcessed,
ISzAlloc *allocMain,
ISzAlloc *allocTemp);
我们先在Windows下编译:
完整代码如下:
/* 7zMain.c - Test application for 7z Decoder
2008-11-23 : Igor Pavlov : Public domain */
#include
#include
#include
#define LOGD printf
#define LOGE printf
#include "7zCrc.h"
#include "7zFile.h"
#include "7zVersion.h"
#include "7zAlloc.h"
#include "7zExtract.h"
#include "7zIn.h"
int MY_CDECL extract7z(const char* srcFile, const char* dstPath)
{
CFileInStream archiveStream;
CLookToRead lookStream;
CSzArEx db;
SRes res;
ISzAlloc allocImp;
ISzAlloc allocTempImp;
char outPath[1024] = { 0 };
LOGD("7z ANSI-C Decoder " MY_VERSION_COPYRIGHT_DATE "\n");
if (InFile_Open(&archiveStream.file, srcFile)) {//open 7z file
LOGE("can not open input file\n");
return 1;
}
FileInStream_CreateVTable(&archiveStream);
LookToRead_CreateVTable(&lookStream, False);
lookStream.realStream = &archiveStream.s;
LookToRead_Init(&lookStream);
allocImp.Alloc = SzAlloc;
allocImp.Free = SzFree;
allocTempImp.Alloc = SzAllocTemp;
allocTempImp.Free = SzFreeTemp;
CrcGenerateTable();
SzArEx_Init(&db);
res = SzArEx_Open(&db, &lookStream.s, &allocImp, &allocTempImp);
if(res == SZ_OK)
{
Int32 i;
UInt32 blockIndex = 0xFFFFFFFF; /* it can have any value before first call (if outBuffer = 0) */
Byte *outBuffer = 0; /* it must be 0 before first call for each new archive. */
size_t outBufferSize = 0; /* it can have any value before first call (if outBuffer = 0) */
LOGD("Total file/directory count[%d]\n", db.db.NumFiles);
for (i = db.db.NumFiles - 1; i >= 0; i--) {
size_t offset;
size_t outSizeProcessed;
CSzFileItem *f = db.db.Files + i;
strcpy(outPath, dstPath);
strcat(outPath, "/");
strcat(outPath, f->Name);
if (f->IsDir) {//dir
LOGD("dir [%s]\n", outPath);
mkdir(outPath);
continue;
}else{//file
LOGD("file [%s]\n", outPath);
res = SzAr_Extract(&db, &lookStream.s, i, &blockIndex,
&outBuffer, &outBufferSize, &offset, &outSizeProcessed,
&allocImp, &allocTempImp);
if (res != SZ_OK){
break;
}else{
CSzFile outFile;
size_t processedSize;
if (OutFile_Open(&outFile, outPath)) {
LOGE("can not open output file\n");
res = SZ_ERROR_FAIL;
break;
}
processedSize = outSizeProcessed;
if (File_Write(&outFile, outBuffer + offset, &processedSize)
!= 0 || processedSize != outSizeProcessed) {
LOGE("can not write output file\n");
res = SZ_ERROR_FAIL;
break;
}
if (File_Close(&outFile)) {
LOGE("can not close output file\n");
res = SZ_ERROR_FAIL;
break;
}
}
}
}
IAlloc_Free(&allocImp, outBuffer);
}
SzArEx_Free(&db, &allocImp);
File_Close(&archiveStream.file);
if (res == SZ_OK)
{
LOGD("Everything is Ok\n");
return 0;
}
if (res == SZ_ERROR_UNSUPPORTED
)
LOGE("decoder doesn't support this archive\n");
else if (res == SZ_ERROR_MEM
)
LOGE("can not allocate memory\n");
else if (res == SZ_ERROR_CRC
)
LOGE("CRC error\n");
else
LOGE("ERROR #%d\n", res);
return 1;
}
int main(int numargs, char *args[])
{
return extract7z(args[1], args[2]);
}
我用的是Eclipse,使用Mingw编译。
执行效果,能正确解压。
这样的解压只能适用简单的解压,不支持加密,参数2的输出文件路径中的所有文件夹都必须存在,压缩包中文件夹不需要存在,解压时会自动创建。
压缩包中的文件夹不能为中文,否则乱码。
c语言lzma算法,C语言编程使用lzma SDK对7z文件简略解压缩相关推荐
- 快速排序实验报告 c语言,快速排序算法c语言实验报告.docx
快速排序算法c语言实验报告 实验六:冒泡法排序 物理学416班赵增月F12XX日期:XX年10月31日 一·实验目的1.熟练掌握程序编写步骤: 2.学习使用冒泡法和选择法排序: 3.熟练掌握数组的定义 ...
- c语言程序设计 算法,C语言程序设计第二章算法
<C语言程序设计第二章算法>由会员分享,可在线阅读,更多相关<C语言程序设计第二章算法(38页珍藏版)>请在人人文库网上搜索. 1.C程序设计,主讲人:袁丽,燕大里仁基础教学部 ...
- c语言考试算法,c语言考试常用算法docx.docx
c语言考试常用算法docx 求1~100的累加和#includevoid main(){inti=1,sum=0;while (i<=100){sum+=i;i++;}printf(" ...
- 10幻方c语言,幻方算法 C语言描述
幻方算法的所有情况描述及C语言表示 2019-03-30 讨论幻方前,先讨论一下动态申请数组大小 众所周知 在C语言中必须指定数组的大小 否则会报错.如果你不知道你要申请多大的数组怎么办?初始化一个非 ...
- 自动寻路算法C语言,bfs算法(c语言贪吃蛇自动寻路算法)
广度优先法(BFS)算法C/C++代码,要说明和图解!谢谢! #include #define MAX 10 int front=-1,rear=-1; struct node { int value ...
- 经典c语言程序设计算法,C语言程序设计和循环结构相关的经典算法之一.ppt
C语言程序设计和循环结构相关的经典算法之一 第七讲 循环结构的经典算法之一 程序设计举例 ;教 学目 的 :1.灵活运用循环语句 2.编写一些基本算法程序 教学重点和难点:重点:判断素数,求最大公约数 ...
- c语言峰值算法_C语言寻找一组数据中的第一第二峰值
C语言寻找一组数据中的第一第二峰值 实验要求,我需要找出一组数组中的两个峰值:第一个峰值和第二个峰值及其数组下标.这组数据画出的图应该是这样的,我就要找出图中的那两个峰值 我写的程序如下,我试了一下, ...
- c语言排序算法_C语言写排序算法(二) —— 选择排序
上次联系的算法是冒泡排序,不知道小伙伴们还记得不,中间穿插了一下比特币相关的分享,嘿嘿.今天来分享一下选择排序. 算法描述:选择排序是从数组中选择最大(小)的元素放到数组的最后一个,然后往前移,接着从 ...
- C语言HeapBottomUP算法,C语言堆的建立Percolate Up and Down
6-8 Percolate Up and Down (20 point(s)) Write the routines to do a "percolate up" and a &q ...
最新文章
- mysql事务处理用法与实例详解
- php排序最新,PHP排序的几种方法,值得来看!
- 设计模式学习 - 工厂模式
- java随机抽题系统_在用java做一个在线考试系统,随机抽题遇到了问题,我写了一个随机抽题的方法,不知道在asp按钮中怎么用...
- HDU-4777 Rabbit Kingdomom(树状数组、区间离线)
- c++ primer 5th 练习11.9自己编写的答案
- Linux命令行上执行操作,不退回命令行的解决方法
- Selector 实现原理
- 百练 06 股票买卖
- android中获取打气筒的几种方式
- 3DSMAX制作超时空未来动画场景-3D建模场景模型教程
- 混沌:Logistic模型
- 软件智能:aaas系统设计概要 之 序 结篇:计算的三位一体主义
- xp系统开机自检很久_XP系统取消开机自检的5种方法?
- PC版微信数据库解密详细教程
- linux无线网卡速度慢,Linux如何解决英特尔无线网卡WiFi网速慢、WiFi蓝牙无法共存等问题...
- JVAV-基础②标识符与运算符
- 什么是FDR校正,核磁共振成像中FDR校正方法有哪些?如何进行FDR校正?
- Chrome开发工具Network没有显示完整的http request和response对话
- 阿里云 vs Azure-安全
热门文章
- wkhtmltopdf下载pdf有个别字体是乱码
- c语言香农编码文件压缩,谈谈熵编码无损压缩的原理
- 内网渗透建立代理通道(如何攻击目标内网机器?)-Socks代理(゚益゚メ) 渗透测试
- 机器学习:XGBoost+LightGBM+catboost+5折+stacking的用法
- 记录:Flink checkpoint 过期导致失败(线上问题)
- 基因编辑c语言,此“基因编辑”非彼“基因编辑”
- Android M的App Links实现详解
- h5文件格式数据集制作
- 墨刀和axure的区别
- 云直播丁云鹏:最可怕的,是你低估生活的残酷