c++基于zlib的gzip解压缩方法
2022/3/21 12:57:53
本文主要是介绍c++基于zlib的gzip解压缩方法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
在项目中用到了基于数据库的大数据量存取时,我们要考虑的是数据读取速度,及数据存储大小,往往数据存储量大的话,数据读取速度也会随之降低,所以我们降低数据存储大小的方法,一是,使用位单位来存储数据,尽量压缩数据大小;二是,在将数据量控制在最小后,数据依旧大,那么我们需要使用压缩算法进行压缩;
在这次项目中我们使用了gzip压缩算法来压缩数据存储到redis中,然后我们使用c++开发一个数据中间件对数据进行统计分析,所以我们使用到了zlib对获取出来的大数据块进行解压缩,解压缩代码如下:
bool Uncompress(unsigned char * src, size_t src_size, unsigned char *dest, size_t &dest_size) { int bufSize = 1024; Byte *buf = static_cast<Byte *>(malloc(bufSize * sizeof(Byte))); int err = 0; z_stream d_stream = { 0 }; d_stream.zalloc = NULL; d_stream.zfree = NULL; d_stream.opaque = NULL; d_stream.next_in = src; d_stream.avail_in = 0; d_stream.next_out = buf; if (inflateInit2(&d_stream, MAX_WBITS + 16) != Z_OK) { _mLastErrorString = "Uncompress gzip: inflateInit2 error"; return false; } uLong totalOut = 0; while (d_stream.total_in < src_size && d_stream.total_out < dest_size) { memset(buf, 0, bufSize); d_stream.next_out = buf; d_stream.avail_in = d_stream.avail_out = bufSize; err = inflate(&d_stream, Z_NO_FLUSH); if (err >= 0) { memcpy(dest + totalOut, buf, d_stream.total_out - totalOut); totalOut = d_stream.total_out; if (err == Z_STREAM_END) { break; } } else { break; } } d_stream.next_out = NULL; delete buf; buf = NULL; if (inflateEnd(&d_stream) != Z_OK) { _mLastErrorString = "Uncompress gzip: inflateEnd error"; return false; } return true; }
这篇关于c++基于zlib的gzip解压缩方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26小白家庭 nas 搭建方案-icode9专业技术文章分享
- 2024-06-23AI大模型企业应用实战(14)-langchain的Embedding
- 2024-06-23AI大模型企业应用实战(15)-langchain核心组件
- 2024-06-23AI大模型企业应用实战(16)-langchain核心组件
- 2024-06-23AI 大模型企业应用实战(06)-初识LangChain
- 2024-06-19EntBot.ai: AI Website Chatbot for Product Guides and Development Doc
- 2024-06-17zero-shot-learning-definition-examples-comparison
- 2024-06-06Package Easy(基于 NSIS 的打包exe安装包工具)使用方法-icode9专业技术文章分享
- 2024-06-06基于 casdoor 的 ELK 开源登录认证解决方案: elk-auth-casdoor-icode9专业技术文章分享
- 2024-05-29Elasticsearch慢查询日志配置