实际上,zlib 可以将 gzip 格式的数据写入内存中的缓冲区。
此zlib 常见问题解答条目遵循 zlib.h 中的注释。在头文件中,deflateInit2() 的注释提到您应该(任意?)将 16 添加到第 4 个参数(windowBits),以使库使用 gzip 格式(而不是默认的“zlib “ 格式)。
此代码正确设置 zlib 状态以将 gzip 编码到缓冲区:
#include <zlib.h>
z_stream stream;
stream.zalloc = Z_NULL;
stream.zfree = Z_NULL;
stream.opaque = Z_NULL;
int level = Z_DEFAULT_COMPRESSION;
int method = Z_DEFLATED; /* mandatory */
int windowBits = 15 + 16; /* 15 is default as if deflateInit */
/* were used, add 16 to enable gzip format */
int memLevel = 8; /* default */
int strategy = Z_DEFAULT_STRATEGY;
if(deflateInit2(&stream, level, method, windowBits, memLevel, strategy) != Z_OK)
{
fprintf(stderr, "deflateInit failed\n");
exit(EXIT_FAILURE);
}
/* now use the deflate function as usual to gzip compress */
/* from one buffer to another. */
我确认此过程产生与 gzopen/gzwrite/gzclose 接口完全相同的二进制输出。