调用Zlib库接口压缩、解压缩(C++源码)
1、概述
有些场景需要压缩、解压缩,本例中调用Zlib库接口实现,使用Zlib的静态库。
整体vs工程,后面上传到我的资源。
2、代码
2.1、调用示例
// 调用示例: 压缩std::string out;std::string srcBuf = "123456ABC";MyZlibUtil::CompressBuf(srcBuf, out);cout << "CompressBuf out:" << out << endl;// 调用示例: 解压缩std::string src1 = out;std::string out1;MyZlibUtil::UncompressBuf(src1, out1);cout << "CompressBuf out:" << out1 << endl;
2.2、源码
#ifndef MyZlib_Util_h_
#define MyZlib_Util_h_#include <string>class MyZlibUtil
{
public:MyZlibUtil() = delete;~MyZlibUtil() = delete;public:static bool CompressBuf(const std::string& strSrcBuf, std::string& strOutBuf);static bool UncompressBuf(const std::string& strSrcBuf, std::string& strDestBuf);
};
#endif // !MyZlib_Util_h_
#include "MyZlibUtil.h"
#include "zlib.h"
#include <memory>constexpr size_t MAX_COMPRESS_BUF_SIZE = 20 * 1024 * 1024;bool MyZlibUtil::CompressBuf(const std::string& strSrcBuf, std::string& strOutBuf)
{if (strSrcBuf.empty() || strSrcBuf.length() > MAX_COMPRESS_BUF_SIZE){return false;}// 估算压缩数据的最大可能大小// 它返回一个上界值,保证原始数据压缩后不会超过这个长度uLongf destLen = compressBound(strSrcBuf.length());std::unique_ptr<unsigned char, std::default_delete<unsigned char[]>> buf(new unsigned char[destLen]);int ret = compress(buf.get(), &destLen, (const Bytef*)strSrcBuf.c_str(), strSrcBuf.length());if (ret != Z_OK){return false;}strOutBuf.clear();strOutBuf.append((char*)buf.get(), destLen);return true;
}bool MyZlibUtil::UncompressBuf(const std::string& strSrcBuf, std::string& strDestBuf)
{if (strSrcBuf.empty() || strSrcBuf.length() > MAX_COMPRESS_BUF_SIZE){return false;}uLongf len = strSrcBuf.length() * 8;std::unique_ptr<unsigned char, std::default_delete<unsigned char[]>> upDestBuf(new unsigned char[len]);int ret = uncompress(upDestBuf.get(), &len, (const Bytef*)strSrcBuf.c_str(), strSrcBuf.length());if (ret != Z_OK){return false;}strDestBuf.clear();strDestBuf.append((char*)upDestBuf.get(), len);return true;
}
