有时候我们只需要单纯对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文件简略解压缩相关推荐

  1. 快速排序实验报告 c语言,快速排序算法c语言实验报告.docx

    快速排序算法c语言实验报告 实验六:冒泡法排序 物理学416班赵增月F12XX日期:XX年10月31日 一·实验目的1.熟练掌握程序编写步骤: 2.学习使用冒泡法和选择法排序: 3.熟练掌握数组的定义 ...

  2. c语言程序设计 算法,C语言程序设计第二章算法

    <C语言程序设计第二章算法>由会员分享,可在线阅读,更多相关<C语言程序设计第二章算法(38页珍藏版)>请在人人文库网上搜索. 1.C程序设计,主讲人:袁丽,燕大里仁基础教学部 ...

  3. c语言考试算法,c语言考试常用算法docx.docx

    c语言考试常用算法docx 求1~100的累加和#includevoid main(){inti=1,sum=0;while (i<=100){sum+=i;i++;}printf(" ...

  4. 10幻方c语言,幻方算法 C语言描述

    幻方算法的所有情况描述及C语言表示 2019-03-30 讨论幻方前,先讨论一下动态申请数组大小 众所周知 在C语言中必须指定数组的大小 否则会报错.如果你不知道你要申请多大的数组怎么办?初始化一个非 ...

  5. 自动寻路算法C语言,bfs算法(c语言贪吃蛇自动寻路算法)

    广度优先法(BFS)算法C/C++代码,要说明和图解!谢谢! #include #define MAX 10 int front=-1,rear=-1; struct node { int value ...

  6. 经典c语言程序设计算法,C语言程序设计和循环结构相关的经典算法之一.ppt

    C语言程序设计和循环结构相关的经典算法之一 第七讲 循环结构的经典算法之一 程序设计举例 ;教 学目 的 :1.灵活运用循环语句 2.编写一些基本算法程序 教学重点和难点:重点:判断素数,求最大公约数 ...

  7. c语言峰值算法_C语言寻找一组数据中的第一第二峰值

    C语言寻找一组数据中的第一第二峰值 实验要求,我需要找出一组数组中的两个峰值:第一个峰值和第二个峰值及其数组下标.这组数据画出的图应该是这样的,我就要找出图中的那两个峰值 我写的程序如下,我试了一下, ...

  8. c语言排序算法_C语言写排序算法(二) —— 选择排序

    上次联系的算法是冒泡排序,不知道小伙伴们还记得不,中间穿插了一下比特币相关的分享,嘿嘿.今天来分享一下选择排序. 算法描述:选择排序是从数组中选择最大(小)的元素放到数组的最后一个,然后往前移,接着从 ...

  9. 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 ...

最新文章

  1. mysql事务处理用法与实例详解
  2. php排序最新,PHP排序的几种方法,值得来看!
  3. 设计模式学习 - 工厂模式
  4. java随机抽题系统_在用java做一个在线考试系统,随机抽题遇到了问题,我写了一个随机抽题的方法,不知道在asp按钮中怎么用...
  5. HDU-4777 Rabbit Kingdomom(树状数组、区间离线)
  6. c++ primer 5th 练习11.9自己编写的答案
  7. Linux命令行上执行操作,不退回命令行的解决方法
  8. Selector 实现原理
  9. 百练 06 股票买卖
  10. android中获取打气筒的几种方式
  11. 3DSMAX制作超时空未来动画场景-3D建模场景模型教程
  12. 混沌:Logistic模型
  13. 软件智能:aaas系统设计概要 之 序 结篇:计算的三位一体主义
  14. xp系统开机自检很久_XP系统取消开机自检的5种方法?
  15. PC版微信数据库解密详细教程
  16. linux无线网卡速度慢,Linux如何解决英特尔无线网卡WiFi网速慢、WiFi蓝牙无法共存等问题...
  17. JVAV-基础②标识符与运算符
  18. 什么是FDR校正,核磁共振成像中FDR校正方法有哪些?如何进行FDR校正?
  19. Chrome开发工具Network没有显示完整的http request和response对话
  20. 阿里云 vs Azure-安全

热门文章

  1. wkhtmltopdf下载pdf有个别字体是乱码
  2. c语言香农编码文件压缩,谈谈熵编码无损压缩的原理
  3. 内网渗透建立代理通道(如何攻击目标内网机器?)-Socks代理(゚益゚メ) 渗透测试
  4. 机器学习:XGBoost+LightGBM+catboost+5折+stacking的用法
  5. 记录:Flink checkpoint 过期导致失败(线上问题)
  6. 基因编辑c语言,此“基因编辑”非彼“基因编辑”
  7. Android M的App Links实现详解
  8. h5文件格式数据集制作
  9. 墨刀和axure的区别
  10. 云直播丁云鹏:最可怕的,是你低估生活的残酷