Lzma(7-zip) 使用:

在C目录中有算法文件,进入Util\LzmaLib目录,编译生成LIB库,导出了以下两函数,LzmaCompress 为压缩函数,LzmaUncompress 为解压缩函数。

MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen,

unsigned char *outProps, size_t *outPropsSize,

int level,

unsigned dictSize,

int lc,

int lp,

int pb,

int fb,

int numThreads

);

MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, SizeT *srcLen,

const unsigned char *props, size_t propsSize);

导入Types.h 和 Lzmalib.h 到工程中。

代码如下:

#include "stdafx.h"

#include "LzmaLib.h"

#pragma comment(lib,"lzma.lib")

int _tmain(int argc, _TCHAR* argv[])

{

FILE* pFile = _tfopen(_T("file.dat"), _T("rb"));

if (pFile == NULL)

{

_ftprintf(stderr, _T("Error to Open the file!"));

return  - 1;

}

fseek(pFile, 0, SEEK_END);

size_t srcLen = ftell(pFile);

rewind(pFile);

size_t destLen = srcLen * 2;

unsigned char* psrcRead = new unsigned char[srcLen]; //原始文件数据

unsigned char* pDecomress = new unsigned char[srcLen]; //存放解压缩数据

unsigned char* pLzma = new unsigned char[destLen]; //存放压缩数据

fread(psrcRead, sizeof(char), srcLen, pFile);

unsigned char prop[5] =

{

0

};

size_t sizeProp = 5;

if (SZ_OK != LzmaCompress(pLzma, &destLen, psrcRead, srcLen, prop,

&sizeProp, 9, (1 << 24), 3, 0, 2, 32, 2))

{

//出错了

_ftprintf(stderr, _T("压缩时出错!"));

delete [] psrcRead;

delete [] pDecomress;

delete [] pLzma;

fclose(pFile);

return  - 1;

}

FILE* pCompressFile = _tfopen(_T("compress.dat"), _T("wb"));

//写入压缩后的数据

if (pCompressFile == NULL)

{

_ftprintf(stderr, _T("创建文件出错!"));

delete [] psrcRead;

delete [] pDecomress;

delete [] pLzma;

fclose(pFile);

return  - 1;

}

fwrite(pLzma, sizeof(char), destLen, pCompressFile);

fclose(pCompressFile);

FILE* pDecompressFile = _tfopen(_T("decompress.dat"), _T("wb"));

//写入解压缩数据

if (pDecompressFile == NULL)

{

_ftprintf(stderr, _T("写入数据出错!"));

delete [] psrcRead;

delete [] pDecomress;

delete [] pLzma;

fclose(pFile);

return  - 1;

}

//注意:解压缩时props参数要使用压缩时生成的outProps,这样才能正常解压缩

if (SZ_OK != LzmaUncompress(pDecomress, &srcLen, pLzma, &destLen, prop, 5))

{

delete [] psrcRead;

delete [] pDecomress;

delete [] pLzma;

fclose(pDecompressFile);

fclose(pFile);

return  - 1;

}

fwrite(pDecomress, sizeof(char), srcLen, pDecompressFile);

delete [] psrcRead;

delete [] pDecomress;

delete [] pLzma;

fclose(pDecompressFile);

fclose(pFile);

return 0;

}

zlib使用:

zlib 是通用的压缩库,提供了一套 in-memory 压缩和解压函数,并能检测解压出来的数据的完整性(integrity)。下面介绍两个最有用的函数——compress 和 uncompress。

int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

compress函数将 source 缓冲区中的内容压缩到 dest 缓冲区。 sourceLen 表示source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时,destLen表示 dest 缓冲区的大小,destLen > (sourceLen + 12)*100.1%。当函数退出后,destLen 表示压缩后缓冲区的实际大小。此时 destLen / sourceLen 正好是压缩率。

compress 若成功,则返回 Z_OK;若没有足够内存,则返回 Z_MEM_ERROR;若输出缓冲区不够大,则返回 Z_BUF_ERROR。

int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

uncompress 函数将 source 缓冲区的内容解压缩到 dest 缓冲区。sourceLen 是 source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时,destLen 表示 dest 缓冲区的大小, dest 缓冲区要足以容下解压后的数据。在进行解压缩时,需要提前知道被压缩的数据解压出来会有多大。这就要求在进行压缩之前,保存原始数据的大小(也就是解压后的数据的大小)。这不是 zlib 函数库的功能,需要我们做额外的工作。当函数退出后, destLen 是解压出来的数据的实际大小。

uncompress 若成功,则返回 Z_OK ;若没有足够内存,则返回 Z_MEM_ERROR;若输出缓冲区不够大,则返回 Z_BUF_ERROR。若输入数据有误,则返回 Z_DATA_ERROR。

代码如下:

#include "stdafx.h"

#include

#include

#include

#include "zlib.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

int err = 0;

Byte compr[200] = {0}, uncompr[200] = {0}; // big enough

uLong comprLen = 0, uncomprLen = 0;

const char* hello = "12345678901234567890123456789012345678901234567890";

uLong len = strlen(hello) + 1;

comprLen = sizeof(compr) / sizeof(compr[0]);

err = compress(compr, &comprLen, (const Bytef*)hello, len);

if (err != Z_OK)

{

cerr << "compess error: " << err << '\n';

exit(1);

}

cout << "orignal size: " << len

<< " , compressed size : " << comprLen << '\n';

strcpy((char*)uncompr, "garbage");

err = uncompress(uncompr, &uncomprLen, compr, comprLen);

if (err != Z_OK)

{

cerr << "uncompess error: " << err << '\n';

exit(1);

}

cout << "orignal size: " << len

<< " , uncompressed size : " << uncomprLen << '\n';

if (strcmp((char*)uncompr, hello))

{

cerr << "BAD uncompress!!!\n";

exit(1);

}

else

{

cout << "uncompress() succeed: \n" << (char*)uncompr;

}

}

linux lzma 函数 调用,Lzma(7-zip)和zlib相关推荐

  1. 【转】Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现

    转自:Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现_Jaster_wisdom的专栏-CSDN博客 之前在这里和这里调用了matlab自带的一些函数,是通过matl ...

  2. linux应用调用内核函数,Hooking linux内核函数(一):寻找完美解决方案

    前言 我们最近参与了一个Linux系统安全相关项目,需要hooking几个重要的Linux内核函数调用,例如打开文件和启动进程,并利用它来启用系统活动监控并抢先阻止可疑进程. 最后,我们发明了一种有效 ...

  3. Linux系统函数之IO函数

    技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.标准C库IO函数工作流程 IO缓冲区的作用? 大部分硬盘都是机械硬盘,读取寻道时间 ...

  4. Linux getopt()函数 getopt_long()函数---转

    http://hi.baidu.com/scoundrelgg/item/d4083f8412eea05d26ebd97f Linux getopt()函数 getopt_long()函数 get_o ...

  5. linux下java调用matlab程序,linux_java调用windows_matlab程序

    0 说明 本文为研究java和matlab的混合编程,进行了详细的测试和探索,以解决linux环境下java程序调用matlab程序的一个应用. linux端的环境 :(运行java程序并调用wind ...

  6. Linux下动态链接库调用

    Linux下动态链接库调用 2014-11-01 10:39 3人阅读 评论(0) 收藏 编辑 删除 Linux下动态链接库调用 2013-06-08 20:52:48|  分类:集成开发环境相关 | ...

  7. linux fork函数的精辟解说

    此文原文来源于一个blog,文章的名称为:linux fork函数的精辟解说原文地址:http://blog.chinaunix.net/space.php?uid=12461657&do=b ...

  8. Linux C语言调用C++动态链接库

    Linux C语言调用C++动态链接库 标签: C调用C++库 2014-03-10 22:56 3744人阅读 评论(0) 收藏 举报 分类: [Linux应用开发](48) 版权声明:本文为博主原 ...

  9. Linux时间函数札记

    关于gmtime.gmtime_r.localtime.localtime_r 测试环境:vmware 7 + Redhat5.5,系统时间使用UTC,时区为上海. 1.函数功能介绍 使用man gm ...

最新文章

  1. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
  2. 小学5年级计算机考试作文,我的小学老师五年级优秀作文(通用10篇)
  3. 计算机网络技术超文本,网络协议确定了计算机网络传递和管理信息的规范,其中HTTP属于()A、超文本传输协议B、传输控制协...
  4. c# 从一个大图里截取图形
  5. java开发中准则怎么写_Java开发中通用的方法和准则20条
  6. HDU 2042:不容易系列之二
  7. 苏州大学计算机组成与结构,苏州大学计算机组成结构期末.docx
  8. leetcode python3 简单题69. Sqrt(x)
  9. Camtasia实用技巧之智能聚焦
  10. Quartz.NET开源作业调度框架系列(五):AdoJobStore保存job到数据库
  11. 20170314--服务器监控
  12. 学习Java过程中创建动态数组的两种方法比较
  13. r矢量球坐标系旋度_球坐标系中的矢量算符
  14. 阿里开源配置服务diamond分析
  15. 康托尔点集matlab实数,康托尔集是什么。详细解释
  16. 怎么用手机修改服务器的网关,网关,详细教您手机怎么改网关和IP
  17. php 生成vbs文件,用VBS实现PHP的md5_file函数代码
  18. [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)
  19. 射频测试 —— 蓝牙定频测试3
  20. uniapp 前端导出excel

热门文章

  1. PS怎么做出旧电视图像故障视觉特效
  2. 磁共振t1t2信号记忆顺口溜_【 磁共振t1与t2是啥意义】_特点_特征-大众养生网
  3. leet70:爬楼梯
  4. 第50篇 Android Studio实现生命数字游戏(五)计算星座数
  5. paypal简单分享
  6. 我将进化成一条狗(9)——基因治疗
  7. linux怎么切换键盘布局,Ubuntu 切换键盘布局(colemak - workman - norman)
  8. Python Socket网络编程(二)局域网内和局域网与广域网的持续通信
  9. java 大写中文金额 转 数字
  10. 彩色图片如何转为单色位图bmp :用window画板