• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            The power of C, the power of MD

            A problem is a chance to do your best
            posts - 11, comments - 22, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            使用libz和libbz2的API在項目中集成gzip和bzip2功能

            Posted on 2010-07-30 12:22 roy 閱讀(3004) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            libz提供了一套與gzip有關的API,libbz2提供了一套與bzip2有關的API。我們可以利用其中幾個常用的函數,在自己的項目中實現壓縮、解壓縮功能。這兩個庫文件一般在linux系統中都會有,如果沒有,可以分別到以下網址下載其源代碼:

             

            gzip: http://www.gzip.org/

            bzip2: http://www.bzip.org/index.html

             

            libz最有用的函數有四個:

             

            gzFile gzopen(const char *path, const char *mode);

            int gzclose(gzFile file);

            int gzread(gzFile file, void *buf, unsigned len);

            int gzwrite(gzFile file, const void *buf, unsigned len);

             

            追蹤其源代碼的話,可以發現,gzFile也就是void *

             

            libbz2最有用的函數也有四個:

             

            BZFILE *BZ2_bzopen(const char *path, const char *mode);

            void BZ2_bzclose(BZFILE *file);

            int BZ2_bzread(BZFILE *file, void *buf, int len);

            int BZ2_bzwrite(BZFILE *file, void *buf, int len);

             

            追蹤其源代碼的話,可以發現,BZFILE也就是void

             

            所以說,libz的四個函數與libbz2的四個函數,無論從名字上看,還是從參數上看,都是如出一轍的。只不過,gzopen()和gzread()可以打開和讀取任何文件,而BZ2_bzopen()和BZ2_bzread()只能打開和讀取bzip2壓縮的文件。

             

            事實上,它們與普通文件的打開、關閉、讀取、寫入的四個函數,基本上是對應的:

             

            FILE *fopen(const char *path, const char *mode);

            int fclose(FILE *fp);

            int fread(void *buf, int size_of_element, int len, FILE *fp);

            int fwrite(void *buf, int size_of_element, int len, FILE *fp);

             

            要打開一個打算讀取的二進制文件,三個打開函數的調用分別是:

            gzopen("filename", "r");

            BZ2_bzopen("filename", "r");

            fopen("filename", "rb");

             

            要打開一個打算寫入的二進制文件,三個打開函數的調用分別是:

            gzopen("filename", "w");

            BZ2_bzopen("filename", "w");

            fopen("filename", "w");

             

            可以說參數的使用是基本一樣的,不過gzopen()和BZ2_bzopen()的mode參數一般沒有"rb"而只有"r",因為它們處理的基本上都是二進制文件,不需要特別指明。此外,mode參數還有其它用法,比如制定壓縮率等,具體可以查看源代碼。

             

            不同的地方之一,FILE是一個關于文件信息的結構體,而不是void類型,之二,gzread()、gzwrite()、BZ2_bzread()和BZ2_bzwrite()的參數位置與fread()和fwrite()不一樣,同時也省略了size_of_element參數。

             

            有了這兩套API,我們就可以很方便地寫出程序對文件進行壓縮、解壓縮操作,更多的是,把壓縮、解壓縮功能集成到自己的項目中去,使得項目支持壓縮格式。舉例如下:

             

            1. 如果使用libz的API,壓縮就是對源文件進行fopen()/fread()/fclose()操作,對目標文件進行gzopen()/gzwrite()/gzclose()操作;解壓縮就是對源文件進行gzopen()/gzread()/gzclose()操作,對目標文件進行fopen()/fwrite()/fclose()操作
            2. 如果使用libbz2的API,壓縮就是對源文件進行fopen()/fread()/fclose()操作,對目標文件進行BZ2_bzopen()/BZ2_bzwrite()/BZ2_bzclose()操作;解壓縮就是對源文件進行BZ2_bzopen()/BZ2_bzread()/BZ2_bzclose()操作,對目標文件進行fopen()/fwrite()/fclose()操作

             

            如果要直接使用libz和libbz2,很簡單,只需要做到三件事:

            1.     include頭文件。把zlib.h和bzlib.h包含到項目源程序中

            2.     鏈接庫文件。如果由于權限問題不能安裝庫文件,需要在編譯時指定庫文件的路徑

            3.     如果庫文件沒有安裝在系統默認的搜索路徑,運行前還要修改LD_LIBRARY_PATH環境變量,使得運行時能夠找到庫文件

             

            值得注意的是,以上列出的只是libz和libbz2里面最常用、比較高級的函數,其實,這兩個庫文件里還有其它底層的函數,利用這些底層函數,甚至可以解壓.Z結尾的壓縮文件。具體做法就要慢慢參透libz的全部源代碼了。

             

            本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/yui/archive/2010/07/01/5707842.aspx

            综合人妻久久一区二区精品| 99久久国产综合精品网成人影院 | 国内精品久久久久久久久| 狠狠久久综合伊人不卡| 精品国产91久久久久久久| 久久久精品国产| 久久人人爽人人爽人人片AV东京热| 久久青青草原亚洲av无码app| 亚洲日韩欧美一区久久久久我| 99久久伊人精品综合观看| 2021久久精品免费观看| 99久久夜色精品国产网站| 久久精品国产色蜜蜜麻豆| 伊人久久大香线蕉影院95| 亚洲国产精品综合久久网络| 久久精品黄AA片一区二区三区 | 亚洲综合精品香蕉久久网| 大香伊人久久精品一区二区| 国产精品免费福利久久| 99久久精品国产一区二区三区 | 色狠狠久久综合网| 久久国产成人亚洲精品影院| 老男人久久青草av高清| 亚洲综合久久综合激情久久| 久久av免费天堂小草播放| 久久se精品一区二区| 久久久久成人精品无码中文字幕| 四虎国产精品免费久久久| 久久精品国产WWW456C0M| 97精品伊人久久久大香线蕉| 婷婷五月深深久久精品| 久久亚洲精品无码aⅴ大香| 久久久无码精品亚洲日韩蜜臀浪潮| 97精品伊人久久大香线蕉app| 性做久久久久久免费观看| 国产精品99久久99久久久| 亚洲中文字幕伊人久久无码| 久久国产成人午夜aⅴ影院| 天天综合久久一二三区| 久久久久久久精品妇女99| 久久精品二区|