用于压缩的缓冲区的 zlib c++ char 大小
zlib c++ char size of buffer for compression
我正在使用此函数进行 zlib 压缩,想知道是否应将 outbuffer 变量设置为特定大小?它是否将 char 数组限制为我在此处放置的任何内容?我可以放在这里的长度有限制吗?将它转换为 std::string 是否有意义,因为我是用 C++ 编译的?
/** Compress a STL string using zlib with given compression level and return
* the binary data. */
std::string compress_string(const std::string& str, int compressionlevel = 9)
{
z_stream zs; // z_stream is zlib's control structure
memset(&zs, 0, sizeof(zs));
if (deflateInit(&zs, compressionlevel) != Z_OK)
throw(std::runtime_error("deflateInit failed while compressing."));
// For the compress
deflateInit2(&zs, compressionlevel, Z_DEFLATED,MOD_GZIP_ZLIB_WINDOWSIZE + 16,MOD_GZIP_ZLIB_CFACTOR,Z_DEFAULT_STRATEGY) != Z_OK;
zs.next_in = (Bytef*)str.data();
zs.avail_in = str.size(); // set the z_stream's input
int ret;
char outbuffer[3222768];
std::string outstring;
// retrieve the compressed bytes blockwise
do {
zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
zs.avail_out = sizeof(outbuffer);
ret = deflate(&zs, Z_FINISH);
if (outstring.size() < zs.total_out) {
// append the block to the output string
outstring.append(outbuffer,zs.total_out - outstring.size());
}
}
while (ret == Z_OK);
deflateEnd(&zs);
if (ret != Z_STREAM_END) { // an error occurred that was not EOF
std::ostringstream oss;
oss << "Exception during zlib compression: (" << ret << ") " << zs.msg;
throw(std::runtime_error(oss.str()));
}
return outstring;
}
这就是 deflateBound()
的用途。在你 deflateInit2()
之后,你可以用输入大小调用它,它会给你在压缩不可压缩数据时可能扩展的限制。
顺便说一句,在同一个结构上调用deflateInit/deflateInit2两次会导致大量内存泄漏。只需调用其中之一即可。
您应该完整阅读 zlib documentation。
我正在使用此函数进行 zlib 压缩,想知道是否应将 outbuffer 变量设置为特定大小?它是否将 char 数组限制为我在此处放置的任何内容?我可以放在这里的长度有限制吗?将它转换为 std::string 是否有意义,因为我是用 C++ 编译的?
/** Compress a STL string using zlib with given compression level and return
* the binary data. */
std::string compress_string(const std::string& str, int compressionlevel = 9)
{
z_stream zs; // z_stream is zlib's control structure
memset(&zs, 0, sizeof(zs));
if (deflateInit(&zs, compressionlevel) != Z_OK)
throw(std::runtime_error("deflateInit failed while compressing."));
// For the compress
deflateInit2(&zs, compressionlevel, Z_DEFLATED,MOD_GZIP_ZLIB_WINDOWSIZE + 16,MOD_GZIP_ZLIB_CFACTOR,Z_DEFAULT_STRATEGY) != Z_OK;
zs.next_in = (Bytef*)str.data();
zs.avail_in = str.size(); // set the z_stream's input
int ret;
char outbuffer[3222768];
std::string outstring;
// retrieve the compressed bytes blockwise
do {
zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
zs.avail_out = sizeof(outbuffer);
ret = deflate(&zs, Z_FINISH);
if (outstring.size() < zs.total_out) {
// append the block to the output string
outstring.append(outbuffer,zs.total_out - outstring.size());
}
}
while (ret == Z_OK);
deflateEnd(&zs);
if (ret != Z_STREAM_END) { // an error occurred that was not EOF
std::ostringstream oss;
oss << "Exception during zlib compression: (" << ret << ") " << zs.msg;
throw(std::runtime_error(oss.str()));
}
return outstring;
}
这就是 deflateBound()
的用途。在你 deflateInit2()
之后,你可以用输入大小调用它,它会给你在压缩不可压缩数据时可能扩展的限制。
顺便说一句,在同一个结构上调用deflateInit/deflateInit2两次会导致大量内存泄漏。只需调用其中之一即可。
您应该完整阅读 zlib documentation。