在C++中,可以使用zlib库来进行gzip压缩和解压缩的操作。以下是使用zlib库进行gzip压缩和解压缩的流操作:
#include <zlib.h>
std::string compressData(const std::string& data)
{
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.next_in = (Bytef*)data.data();
strm.avail_in = data.size();
if (deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 | 16, 8, Z_DEFAULT_STRATEGY) != Z_OK)
{
return "";
}
std::string compressedData;
char out[1024];
do
{
strm.next_out = (Bytef*)out;
strm.avail_out = sizeof(out);
if (deflate(&strm, Z_FINISH) == Z_STREAM_ERROR)
{
deflateEnd(&strm);
return "";
}
compressedData.append(out, sizeof(out) - strm.avail_out);
} while (strm.avail_out == 0);
deflateEnd(&strm);
return compressedData;
}
#include <zlib.h>
std::string decompressData(const std::string& compressedData)
{
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.next_in = (Bytef*)compressedData.data();
strm.avail_in = compressedData.size();
if (inflateInit2(&strm, 15 | 16) != Z_OK)
{
return "";
}
std::string decompressedData;
char out[1024];
do
{
strm.next_out = (Bytef*)out;
strm.avail_out = sizeof(out);
if (inflate(&strm, Z_NO_FLUSH) == Z_STREAM_ERROR)
{
inflateEnd(&strm);
return "";
}
decompressedData.append(out, sizeof(out) - strm.avail_out);
} while (strm.avail_out == 0);
inflateEnd(&strm);
return decompressedData;
}