zlib - uncompress函数

/*
× 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;
}   
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容