有时候我们只需要单纯对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 <stdlib.h> #include <stdio.h> #include <string.h> #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的输出文件路径中的所有文件夹都必须存在,压缩包中文件夹不需要存在,解压时会自动创建。
压缩包中的文件夹不能为中文,否则乱码。
相关推荐
通过Qt5使用LZMA SDK完成C++的7z格式文件压缩和解压缩(源码和可执行文件均包含在内),实现了百分比进度条显示功能。
LZMA 是 7-Zip 程序中 7z 格式 的默认压缩算法。LZMA 能提供给用户极高的压缩比及较快的压缩速度,它非常适合与应用程序集成。 LZMA SDK 包括: LZMA 编码器及解码器的 C++ 源代码 LZMA 压缩及解压缩的 C++ 源...
Q7Zip:使用LZMA SDK压缩和提取7z格式文件的Qt示例
计划在项目中使用 不压缩的Assetbundle ,所以需要对Assetbundle 进行手动压缩打包,因为之前有对 十万个冷笑话的打包分析,所以这次坚定选择 LZMA压缩算法来压缩Assetbundle。
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 ...
LZMA SDK 4.65,LzmaUtil文件夹下的VC6工程(纯C)可以直接打开,并编译通过,编译出来的exe可直接使用,有压缩和解压两种功能
QT + LZMA SDK文件压缩及解压
提供了编译好的最新版LZMA.dll 供vc使用。也提供了调用示例。 更多参考见说明。
7zip源代码 官方的源码包 适用于Windows的LZMA SDK C,C ++,C#,Java x86 / x64二进制文件 19.00 2019-02-21
7z官方的SDK,目前最新的版本 9.22
AndroidUn7zip, 简单的android ndk库,用于简单地提取 lzma 7z 文件 AndroidUn7zip ( 安卓7zip解压)一个带有 lzma sdk的7z 抽取库。简介开始使用dependencies { compile 'com.hzy:un7zip:1.3.0'}boo
使用lzma SDK对7z文件简单解压缩 有时候我们只需要单纯对lzma算法压缩的7z文件进行解压,有时需要在嵌入式设备上解压,使用p7zip虽然支持多种格式,但是不容易裁剪,使用lzma SDK是首选: 可以在这里找到各种版本:...
LZMA,(Lempel-Ziv-Markov chain-Algorithm的缩写),是一个Deflate和LZ77算法改良和优化...LZMA 是 7-Zip 程序中7z 格式的默认压缩算法。LZMA 能提供给用户极高的压缩比及较快的压缩速度,它非常适合与应用程序集成。
LZMA 压缩及解压缩算法的 C 源代码,包括了编码器及解码器的 C 源码 ANSI-C LZMA 解压缩代码是从原始的 C 源代码转换到 C。并简化和优化了代码的大校但它依然和 7-Zip 的 LZMA 完全兼容。LZMA 的压缩速度:在 1 GHz ...
使用LZMA的压缩算法封装的便于使用的组件CompressHelper,提供_7zSimplifier类用于简化压缩/解压...其中LZMA 算法是 7z 格式的默认算法,具有压缩比高、字典大小可变等特点,而其SDK就是本组件制作所依赖的主要工具。
lzma c源代码实现
LZMA 是 7-Zip 程序中 7z 格式 的默认压缩算法。LZMA 能提供给用户极高的压缩比及较快的压缩速度,它非常适合与应用程序集成。
一个使用lzma sdk进行7z提取的简单库。(使用LZMA SDK解压7z压缩包) 介绍 官方网站: : 7z是新的存档格式,可提供高压缩率。 开始使用 添加gradle依赖关系: dependencies { implementation ' ...
* .7z归档文件在内存中的解压缩仅需一个函数即可。 我太笨了,无法以COM方式使用它。 仅Windows。 先决条件 在运行时,Extract7z需要7-Zip安装随附的DLL文件7z.dll (通常在文件夹C:\Program Files\7-Zip\ )。 ...