zlib - compress函数

/*
× zlib库compress和uncompress函数的使用,
× 程序可以独立完成简单的文件压缩功能
××××××××××××××××××××××××××××××××××××××××××××××××
× 用法:z_compress 源文件名 目标文件名××××××××××
××××××××××××××××××××××××××××××××××××××××××××××××
× 目标文件:源文件长度+压缩后数据长度+压缩数据××
××××××××××××××××××××××××××××××××××××××××××××××××
*/

#include <stdlib.h>
#include <stdio.h>
#include <zlib.h>

int main(int argc,char* argv[]) {
    FILE* file;
    uLong flen;
    unsigned char* fbuf = NULL;
    uLong clen;
    unsigned char* cbuf = NULL;

    //通过命令行参数将srcfile文件的数据压缩后存放在dstfile文件中
    if(argc<3) {
        printf("Usage: z_compress srcfile dstfile\n");
        return -1;
    }

    if ( (file = fopen(argv[1],"rb")) ==NULL) {
        printf("Can\'t open %s!\n",argv[1]);
        return -1;
    }

    // 装载源文件数据到缓冲区
    fseek(file,0L,SEEK_END); // 跳到文件尾
    flen = ftell(file); // 获取文件长度
    fseek(file,0L,SEEK_SET);

    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);

    // 压缩数据
    clen = compressBound(flen);
    if ( (cbuf=(unsigned char*)malloc(sizeof(unsigned char)* clen))==NULL) {
        printf("No enough memory!\n");
        fclose(file);
        return -1;
    }
    if (compress(cbuf,&clen,fbuf,flen)!=Z_OK) {
        printf("Compress %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(&flen, sizeof(uLong),1,file); // 写入源文件长度
    fwrite(&clen,sizeof(uLong),1,file); //写入目标数据长度
    fwrite(cbuf,sizeof(unsigned char),clen,file);
    fclose(file);

    free(fbuf);
    free(cbuf);

    return 0;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 使用Object-C代码来实现gzip的压缩功能,不管网上找的哪个地方的代码,方法都是一样的 https://gi...
    skylinyanchen阅读 580评论 0 0
  • 可以看一下我的Github项目,使用封装zlib库的ZLibString类进行压缩C++字符串。 使用将ZLibS...
    明天不用上课阅读 6,261评论 0 3
  • 参照N久找到的外网上别人的代码,加入了一些自己的理解。 可以是多图生成一个视频,也可以是一个图片单独生成视频;当时...
    MatthewSp阅读 1,111评论 0 0
  • 今天我的一个弟弟失恋了,他的女朋友我也认识,我花费了将近一个小时在和他聊天,他一直说,一直在倾诉,虽然说我和他聊了...
    张欢跃阅读 537评论 0 50