日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简易zlib库解压缩函数封装

發布時間:2025/4/5 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简易zlib库解压缩函数封装 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近由于要用zip解壓縮,網上找了,沒看到滿意的源碼,于是自己寫了一個。親測可用

?

接口很簡單,看代碼吧。有問題的地方歡迎留言指正

?

zlib_wrapper.h:

#ifndef ZLIB_WRAPPER #define ZLIB_WRAPPER#include <vector> #include "zlib.h"//把一個字節流用zip算法壓縮,壓縮結果存放在result_buffer里面 //src_buffer: [IN]輸入buffer的起始地址 //src_len: [IN]輸入buffer長度 //result_buffer:[OUT]存放壓縮結果 //返回值:true-成功,buffer存放壓縮結果 // false-壓縮失敗 bool zip_buffer(const char *src_buffer, const unsigned int src_len, std::vector<char> &result_buffer);//從字節流中把數據解壓出來 //src_buffer: [in]待解壓的buffer起始地址 //src_len: [in]帶解壓buffer長度 //result_buffer: [out]解壓結果 //返回值:true-解壓成功,buffer存放解壓結果 // false-解壓失敗 bool unzip_buffer(const char *src_buffer, const unsigned int src_len,std::vector<char> &result_buffer);//輔助函數,用來得到解壓縮的時候所使用的臨時緩存的大小,這里我只是盡量取得一個合理的值. //具體怎么獲得可以修改 unsigned int get_temp_buffer_size(const unsigned int src_length);#endif

?

zlib_wrapper.cpp:

#include "zlib_wrapper.h"bool zip_buffer(const char *src_buffer, const unsigned int src_len, std::vector<char> &result_buffer) {if ((NULL == src_buffer) || (0 == src_len)){return false;}//得到要保存壓縮結果的最小buffer大小unsigned long min_length = compressBound(src_len);result_buffer.resize(min_length);if (Z_OK != compress((Bytef*)&result_buffer[0], &min_length, (Bytef*)src_buffer, src_len)){//壓縮失敗return false;}result_buffer.resize(min_length);return true; }unsigned int get_temp_buffer_size(const unsigned int src_length) {const int MB = 1024*1024;if (src_length < 1*MB){return 1*MB;}else if ((src_length >= 1*MB) && (src_length < 8*MB)){return 8*MB;}else{return 16*MB;} }bool unzip_buffer(const char *src_buffer, const unsigned int src_len, std::vector<char> &result_buffer) {if ((NULL == src_buffer) || (0 == src_len)){return false;}//提供臨時緩存,保存解壓的中間結果const unsigned int temp_buffer_size = get_temp_buffer_size(src_len);std::vector<char> temp_buffer(temp_buffer_size);//使用默認值 z_stream zs;zs.zalloc = Z_NULL;zs.zfree = Z_NULL;zs.next_in = (Bytef*)src_buffer;zs.avail_in = src_len;zs.next_out = (Bytef*)&temp_buffer[0];zs.avail_out = temp_buffer_size;zs.opaque = NULL;if (Z_OK != inflateInit(&zs)){return false;}bool decompress_result = true;for (;;){int ret_val = inflate(&zs, Z_SYNC_FLUSH);if ((Z_OK != ret_val) && (Z_STREAM_END != ret_val)){//發生錯誤decompress_result = false;break;}//得到緩存里面有效數據長度unsigned int valid_data_size = temp_buffer_size - zs.avail_out;result_buffer.insert(result_buffer.end(), &temp_buffer[0], &temp_buffer[0]+valid_data_size);if (Z_OK == ret_val){//待解壓數據沒有處理完//每次把輸出緩沖區重置,免得每次都去計算輸出緩沖區應該開始的地址zs.next_out = (Bytef*)&temp_buffer[0];zs.avail_out = temp_buffer_size; }else if (Z_STREAM_END == ret_val){//所有數據處理完成break;}}inflateEnd(&zs);return decompress_result; }

?

轉載請注明出處,謝謝! ??http://www.cnblogs.com/chenkunyun/archive/2012/12/21/2828425.html

轉載于:https://www.cnblogs.com/chenkunyun/archive/2012/12/21/2828425.html

總結

以上是生活随笔為你收集整理的简易zlib库解压缩函数封装的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。