请注意这段代码:
#define CHUNK 0x4000
z_stream strm;
unsigned char out[CHUNK];
int ret;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
int windowsBits = 15;
int GZIP_ENCODING = 16;
ret = deflateInit2(&strm, Z_BEST_SPEED, Z_DEFLATED, windowsBits | GZIP_ENCODING, 1,
Z_DEFAULT_STRATEGY);
if(ret == Z_OK) {
strm.next_in = (z_const unsigned char *)answer;
strm.avail_in = strlen(answer);
do {
strm.avail_out = CHUNK;
strm.next_out = out;
ret = deflate(&strm, Z_FINISH);
} while (strm.avail_out == 0);
}
/* clean up and return */
(void)deflateEnd(&strm);
在 4 个声明和其余声明之间填充 answer
(包含 200 个元素的无符号字符数组,最后一个元素为\0)。
它在 deflateInit2
中因 Z_MEM_ERROR
崩溃。
我正在开发 STM32F4(微 Controller )。在尝试实现压缩之前,我的 RAM 几乎已满(~87%)。
当我使用不同的参数时,这部分工作了一次,但后来在程序中出现了错误(因为我想将 gzip 压缩的字符串发送到 HTTP 输出,错误是:
unrecognized encoding.
我有:约 30 KB 的可用 RAM。
最佳答案
zlib 的 deflate 通常需要大约 256K 的 RAM。请参阅zlib technical details 。 30K 有点限制,但您仍然可以使用 memLevel
和 windowBits
参数来减少内存占用。从该页面:
deflate memory usage (bytes) = (1 << (windowBits+2)) + (1 << (memLevel+9))
因此,您可以使用 5 的 memLevel
和 11 的 windowBits
来实现这一目标,大约需要 24K(加上一些其他结构)。这会稍微降低压缩效率,但至少它会起作用。 (您仍然可以将 16 添加到 windowBits
中以进行 gzip 编码。)
关于c - Z_MEM_ERROR Zlib deflateInit2() 嵌入式设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51286931/