日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

使用Zlib库进行文件的压缩和解压

發(fā)布時間:2024/6/21 34 生活家
生活随笔 收集整理的這篇文章主要介紹了 使用Zlib库进行文件的压缩和解压 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

zlib介紹

zlib是提供數(shù)據(jù)壓縮用的函式庫,由Jean-loup Gailly與Mark Adler所開發(fā),初版0.9版在1995年5月1日發(fā)表。zlib使用DEFLATE算法,最初是為libpng函式庫所寫的,后來普遍為許多軟件所使 用。此函式庫為自由軟件,使用zlib授權(quán)

配置

我是從網(wǎng)上直接下載了zlib的dll文件的,壓縮包具體有幾個部分,分別是頭文件zconf.h,zlib.h;lib文件 zdll.lib;dll文件zlib1.dll。配置過程很簡單,包含頭文件目錄或引入頭文件;配置VS的工程屬性頁,在鏈接器-常規(guī)-附加庫目錄,添 加lib文件所在目錄,同時在鏈接器-輸入-附加依賴項,添加zdll.lib;最后將zlib1.dll放到Debug目錄和exe文件在一起就可以 了。

例子

#include <stdio.h>
#include "zlib.h"
int main()
{
  /* 原始數(shù)據(jù) */
  unsigned char strSrc[] = "hello world! aaaaa bbbbb ccccc ddddd 中文測試 yes";
  unsigned char buf[1024] = {0};
  unsigned char strDst[1024] = {0};
  unsigned long srcLen = sizeof(strSrc);
  unsigned long bufLen = sizeof(buf);
  unsigned long dstLen = sizeof(strDst);
  printf("Src string:%s
Length:%ld
", strSrc, srcLen);
  /* 壓縮 */
  compress(buf, &bufLen, strSrc, srcLen);
  printf("After Compressed Length:%ld
", bufLen);
  /* 解壓縮 */
  uncompress(strDst, &dstLen, buf, bufLen);
  printf("After UnCompressed Length:%ld
",dstLen);
  printf("UnCompressed String:%s
",strDst);
  return 0;
}

輸出結(jié)果是:

Src string:hello world! aaaaa bbbbb ccccc ddddd 中文測試 yes
Length:50
After Compressed Length:49
After UnCompressed Length:50
UnCompressed String:hello world! aaaaa bbbbb ccccc ddddd 中文測試 yes

這里,zlib只是把一段內(nèi)存壓縮,壓縮后放的另一段內(nèi)存上,這離壓縮文件甚至文件夾的目標還很遠。確切的說,zlib可能并不是一個針對 ZIP文件的庫,它只是一個針對gzip以及deflate算法的庫。它提供了一個叫做minizip (contribminizip) 例子來給出操作 ZIP 文件的方法。

Minizip

Minizip是一個Zip和UnZip文件的附加實例。minizip.c和miniunz.c分別實際的壓縮、解壓程序,除去其主程序minizip.c和miniunz.c后,剩下的部分我們可以看作是zlib的一個上層庫,它封裝了與ZIP文件格式相關(guān)的操作。

壓縮的具體操作

壓縮涉及到以下api:

zipOpen64
zipClose
zipOpenNewFileInZip
zipCloseFileInZip
zipWriteInFileInZip

使用 zipOpen64 來打開/創(chuàng)建一個 ZIP 文件,然后開始遍歷要被放到壓縮包中去的文件。針對每個文件,先調(diào)用一次 zipOpenNewFileInZip,然后開始讀原始文件數(shù)據(jù),使用 zipWriteInFileInZip 來寫入到 ZIP 文件中去。zipOpenNewFileInZip 的第三個參數(shù)是一個 zip_fileinfo 結(jié)構(gòu),該結(jié)構(gòu)數(shù)據(jù)可全部置零,其中 dosDate 可用于填入一個時間(LastModificationTime)。它的第二個參數(shù)是 ZIP 中的文件名,若要保持目錄結(jié)構(gòu),該參數(shù)中可以保留路徑。

解壓的具體操作

解壓縮涉及到以下api:

unzOpen64
unzClose
unzGetGlobalInfo64
unzGoToNextFile
unzGetCurrentFileInfo64
unzOpenCurrentFile
unzCloseCurrentFile
unzReadCurrentFile

打開一個 ZIP 文件后,需要先使用 unzGetGlobalInfo64 來取得該文件的一些信息,來了解這個壓縮包里一共包含了多少個文件,等等。目前我們用得著的就是這個文件數(shù)目。然后開始遍歷 ZIP 中的文件,初始時自動會定位在第一個文件,以后處理完一個后用 unzGoToNextFile 來跳到下一個文件。對于每個內(nèi)部文件,可用 unzGetCurrentFileInfo64 來查內(nèi)部文件名。這個文件名和剛才 zipOpenNewFileInZip 的第二個參數(shù)是一樣的形式,所以有可能包含路徑。也有可能會以路徑分隔符(/)結(jié)尾,表明這是個目錄項(其實壓縮操作的時候也可以針對目錄寫入這樣的內(nèi)部 文件,上面沒有做)。所以接下來要根據(jù)情況創(chuàng)建(多級)目錄。unzGetCurrentFileInfo64 的第三個參數(shù)是 unz_file_info64 結(jié)構(gòu),其中也有一項包含了 dosDate 信息,可以還原文件時間。對于非目錄的內(nèi)部文件,用 unzOpenCurrentFile,打開,然后 unzReadCurrentFile 讀取文件內(nèi)容,寫入到真實文件中。unzReadCurrentFile 返回 0 表示文件讀取結(jié)束。

本文來自:Linux學習網(wǎng)

總結(jié)

以上是生活随笔為你收集整理的使用Zlib库进行文件的压缩和解压的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。