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閱讀 578評論 0 0
  • 可以看一下我的Github項目,使用封裝zlib庫的ZLibString類進行壓縮C++字符串。 使用將ZLibS...
    明天不用上課閱讀 6,254評論 0 3
  • 參照N久找到的外網上別人的代碼,加入了一些自己的理解。 可以是多圖生成一個視頻,也可以是一個圖片單獨生成視頻;當時...
    MatthewSp閱讀 1,110評論 0 0
  • 今天我的一個弟弟失戀了,他的女朋友我也認識,我花費了將近一個小時在和他聊天,他一直說,一直在傾訴,雖然說我和他聊了...
    張歡躍閱讀 537評論 0 50