linux lzma 函数 调用,Lzma(7-zip)和zlib
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相关推荐
- 【转】Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现
转自:Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现_Jaster_wisdom的专栏-CSDN博客 之前在这里和这里调用了matlab自带的一些函数,是通过matl ...
- linux应用调用内核函数,Hooking linux内核函数(一):寻找完美解决方案
前言 我们最近参与了一个Linux系统安全相关项目,需要hooking几个重要的Linux内核函数调用,例如打开文件和启动进程,并利用它来启用系统活动监控并抢先阻止可疑进程. 最后,我们发明了一种有效 ...
- Linux系统函数之IO函数
技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.标准C库IO函数工作流程 IO缓冲区的作用? 大部分硬盘都是机械硬盘,读取寻道时间 ...
- Linux getopt()函数 getopt_long()函数---转
http://hi.baidu.com/scoundrelgg/item/d4083f8412eea05d26ebd97f Linux getopt()函数 getopt_long()函数 get_o ...
- linux下java调用matlab程序,linux_java调用windows_matlab程序
0 说明 本文为研究java和matlab的混合编程,进行了详细的测试和探索,以解决linux环境下java程序调用matlab程序的一个应用. linux端的环境 :(运行java程序并调用wind ...
- Linux下动态链接库调用
Linux下动态链接库调用 2014-11-01 10:39 3人阅读 评论(0) 收藏 编辑 删除 Linux下动态链接库调用 2013-06-08 20:52:48| 分类:集成开发环境相关 | ...
- linux fork函数的精辟解说
此文原文来源于一个blog,文章的名称为:linux fork函数的精辟解说原文地址:http://blog.chinaunix.net/space.php?uid=12461657&do=b ...
- Linux C语言调用C++动态链接库
Linux C语言调用C++动态链接库 标签: C调用C++库 2014-03-10 22:56 3744人阅读 评论(0) 收藏 举报 分类: [Linux应用开发](48) 版权声明:本文为博主原 ...
- Linux时间函数札记
关于gmtime.gmtime_r.localtime.localtime_r 测试环境:vmware 7 + Redhat5.5,系统时间使用UTC,时区为上海. 1.函数功能介绍 使用man gm ...
最新文章
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
- 小学5年级计算机考试作文,我的小学老师五年级优秀作文(通用10篇)
- 计算机网络技术超文本,网络协议确定了计算机网络传递和管理信息的规范,其中HTTP属于()A、超文本传输协议B、传输控制协...
- c# 从一个大图里截取图形
- java开发中准则怎么写_Java开发中通用的方法和准则20条
- HDU 2042:不容易系列之二
- 苏州大学计算机组成与结构,苏州大学计算机组成结构期末.docx
- leetcode python3 简单题69. Sqrt(x)
- Camtasia实用技巧之智能聚焦
- Quartz.NET开源作业调度框架系列(五):AdoJobStore保存job到数据库
- 20170314--服务器监控
- 学习Java过程中创建动态数组的两种方法比较
- r矢量球坐标系旋度_球坐标系中的矢量算符
- 阿里开源配置服务diamond分析
- 康托尔点集matlab实数,康托尔集是什么。详细解释
- 怎么用手机修改服务器的网关,网关,详细教您手机怎么改网关和IP
- php 生成vbs文件,用VBS实现PHP的md5_file函数代码
- [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)
- 射频测试 —— 蓝牙定频测试3
- uniapp 前端导出excel
热门文章
- PS怎么做出旧电视图像故障视觉特效
- 磁共振t1t2信号记忆顺口溜_【 磁共振t1与t2是啥意义】_特点_特征-大众养生网
- leet70:爬楼梯
- 第50篇 Android Studio实现生命数字游戏(五)计算星座数
- paypal简单分享
- 我将进化成一条狗(9)——基因治疗
- linux怎么切换键盘布局,Ubuntu 切换键盘布局(colemak - workman - norman)
- Python Socket网络编程(二)局域网内和局域网与广域网的持续通信
- java 大写中文金额 转 数字
- 彩色图片如何转为单色位图bmp :用window画板