c - Z_MEM_ERROR Zlib deflateInit2() 嵌入式设备

标签 c compression gzip zlib stm32

请注意这段代码:

  #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 有点限制,但您仍然可以使用 memLevelwindowBits 参数来减少内存占用。从该页面:

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/

相关文章:

java - 响应/浏览器中的重复 header 间歇性失败

c - 函数调用中的大括号在 C 中意味着什么?

c - 在 C : "expected constant expression" error in Visual Studio 中编程

c - 如何使用 rand() 函数生成以前未生成过的不同数字?

javascript - 使用 gzip 压缩的意外 token ILLEGAL

ubuntu - 如何在 Ubuntu 中使用 Snappy 压缩文本文件

python - 如何像 Mac OS 的 gunzip 一样解压从 Python3 中的 SFTP 中提取的 GZIP 文件?

c++ - cppsqlite3中的sqlite3的sqlite3_exec是什么(如果有的话)?

c# - 是否可以减少 DateTime.Now.Ticks.ToString ("X"的长度)并仍然保持唯一性?

Ruby 解析 gzip 二进制字符串