Zlib解壓縮示例

2021-09-25 20:04:30 字數 1770 閱讀 8726

先上**,壓縮包的檔案結構解析:

zip=unzopen(resitem->filename); if(0==zip) return false; done=unzgotofirstfile(zip); while(done==unz_ok) dword dwfilenum = 0; dword dwfilepos = 0; unzgetcurrentfileid(zip, &dwfilenum, &dwfilepos); fileposinfo *pfpi = new fileposinfo; pfpi->dwfilenum = dwfilenum; pfpi->dwfilepos = dwfilepos; resitem->mapfileposinfoptr.insert( fileposinfoptrmap::value_type(std::string(szzipname), pfpi) ); done=unzgotonextfile(zip); } unzclose(zip);

函式功能可以通過函式名了解到。這裡只說下:

unzgetcurrentfileinfo(zip, &file_info, szzipname, sizeof(szzipname), null, 0, null, 0);獲取當前檔案資訊並儲存到file_info結構體中。

unzgetcurrentfileid(zip, &dwfilenum, &dwfilepos);得到當前檔案在壓縮包中的位置資訊。第二個引數是該壓縮包到這個檔案時已有的檔案數(可以理解為到檔案頭的偏移),第三個引數就是檔案的位置。可以儲存這兩個引數,方便以後開啟該壓縮包後,直接跳轉到該檔案。

需要注意的是資料夾的相對路徑也會作為乙個szfilename,與檔案類似。即如果有data/user.dat,zlib會讀成兩個:data/、data/user.dat。

下面說下壓縮包中檔案的讀取。**如下:

zip=unzopen( resitem->filename ); if(0==zip) return 0; fileposinfo *pfpi = iter->second; if(0==pfpi) return 0; unzgotofileid(zip, pfpi->dwfilenum, pfpi->dwfilepos); unzgetcurrentfileinfo(zip, &file_info, szzipname, sizeof(szzipname), null, 0, null, 0); if(unzopencurrentfilepassword(zip, resitem->password[0] ? resitem->password : 0) != unz_ok) void *ptr = malloc(file_info.uncompressed_size); if(!ptr) if(unzreadcurrentfile(zip, ptr, file_info.uncompressed_size) < 0) unzclosecurrentfile(zip); unzclose(zip); if(dwsize) *dwsize = file_info.uncompressed_size; return ptr; 

unzgotofileid(zip, pfpi->dwfilenum, pfpi->dwfilepos);即根據上面提到的檔案數(檔案偏移)和檔案位置,跳轉到該檔案。

unzopencurrentfilepassword(zip, resitem->password[0] ? resitem->password : 0)開啟該檔案,第二個引數即壓縮包密碼,沒有密碼就設為0。

unzreadcurrentfile(zip, ptr, file_info.uncompressed_size)讀取檔案內容了。

詳細使用方法請參考**。

zip壓縮與解壓縮示例

範例 zip命令可以用來將檔案壓縮成為常用的zip格式。unzip命令則用來解壓縮zip檔案。1.我想把乙個檔案abc.txt和乙個目錄dir1壓縮成為yasuo.zip zip r yasuo.zip abc.txt dir1 unzip yasuo.zip 3.我當前目錄下有abc1.zip,a...

qt 呼叫zlib壓縮與解壓縮功能

zlib是一種免費且通用的壓縮庫,由於zlib壓縮效果比lzw好,而且解壓縮速度快,更重要的是商業軟體中使用zlib不需要繳納版權費,所以很多遊戲都使用zlib壓縮資源檔案。zlib聯合使用lz77演算法和huffman哈夫曼樹來實現資料壓縮和資料解壓。zlib原始碼 void mainwindow...

Qt之呼叫zlib壓縮與解壓縮功能

zlib是一種免費且通用的壓縮庫,由於zlib壓縮效果比lzw好,而且解壓縮速度快,更重要的是商業軟體中使用zlib不需要繳納版權費,所以很多遊戲都使用zlib壓縮資源檔案。zlib聯合使用lz77演算法和huffman哈夫曼樹來實現資料壓縮和資料解壓。zlib原始碼 void mainwindow...