/*
× zlib库compress和uncompress函数的使用,
× 程序可以独立完成简单的文件解压缩功能
×××××××××××××××××××××××××××××××××××××××××××××××××××××××
× 用法:z_uncompress 源文件名 目标文件名×××××××××××××××××××××
×××××××××××××××××××××××××××××××××××××××××××××××××××××××
× 源(压缩)文件组成:未压缩的文件长度+压缩后数据长度+压缩数据××
×××××××××××××××××××××××××××××××××××××××××××××××××××××××
× 读取:首先获得未压缩的文件长度,构建缓冲区,
× 再获得压缩后数据长度(即数据流大小),即可进行解压缩
*/
#include <stdlib.h>
#include <stdio.h>
#include <zlib.h>
int main(int argc,char* argv[]) {
FILE* file;
uLong flen; // file length
unsigned char* fbuf = NULL;
uLong ulen; // uncompress length
unsigned char* ubuf = NULL;
//通过命令行参数将srcfile文件的数据解压缩后存放在dstfile文件中
if(argc<3) {
printf("Usage: z_uncompress srcfile dstfile\n");
return -1;
}
if ( (file = fopen(argv[1],"rb")) ==NULL) {
printf("Can\'t open %s!\n",argv[1]);
return -1;
}
// 装载源文件到数据缓冲区
fread(&ulen, sizeof(uLong),1,file); // 获取缓冲区大小
fread(&flen, sizeof(uLong),1,file); // 获取数据流大小
if ( (fbuf = (unsigned char*)malloc(sizeof(unsigned char) *flen))==NULL) {
printf("No enough memory!\n");
fclose(file);
return -1;
}
fread(fbuf,sizeof(unsigned char),flen,file); // 读取文件中的数据部分到缓冲区
// 解压缩数据
if ( (ubuf = (unsigned char*)malloc(sizeof(unsigned char) *ulen))==NULL) {
printf("No enough memory!\n");
fclose(file);
return -1;
}
if (uncompress(ubuf, &ulen, fbuf, flen)!=Z_OK) {
printf("Uncompress %s failed!\n",argv[1]);
return -1;
}
fclose(file);
if((file = fopen(argv[2],"wb"))==NULL) {
printf("Can\'t create %s!\n",argv[2]);
return -1;
}
// 保存解压缩后的数据到目标文件
fwrite(ubuf, sizeof(unsigned char),ulen,file);
fclose(file);
free(fbuf);
free(ubuf);
return 0;
}
zlib - uncompress函数
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 在C++中,有三大函数复制控制(复制构造函数,赋值操作符,析构函数),而在C++11中,加入了移动构造函数,移动赋...
- python高级应用与数据分析学习笔记 10 1、概念笔记 2、三元函数的应用:将a b两数组对应元素中较大的那个...