【问题标题】:Z_STREAM_ERROR return from zlib compress() STM32Z_STREAM_ERROR 从 zlib compress() STM32 返回
【发布时间】:2022-01-24 10:12:29
【问题描述】:

我是 zlib 库和 C++ 的新手。所以,我有压缩char的功能,并在STM32上使用compress()compress2()

我尝试了没有在 STM32 上编译的示例代码,它成功了!但是,当我编译到 STM32 时,它总是返回 (-2) 或 Z_STREAM_ERROR。当我打印结果时,它只打印第一个byte。我的设备上有大约 6 kb 的可用内存。代码有什么问题吗?

注意:在zconf.h 上,我已经将MAX_MEM_LEVEL 的数量降低到1MAX_WBITS5

char* compressPayload(char* payload, char* outComp) {
  Serial.println(payload);
  //uLong comprLen = sizeof(outComp);

  int ReturnCode;
  uLong Length = (uLong)strlen(payload)+1;
  uLong comprLen = compressBound(Length);

  ReturnCode = compress((Bytef *)outComp, &comprLen, (const Bytef*)payload, Length);
  Serial.println(ReturnCode);

  return 0;
}

主函数调用:

char jsonNewData[300] = "{\"serialNumber\":\"123456\",\"msg\":\"000000000000000000000000000000000000000000000001\"}"; 
char jsonNewDataComp[200];
compressPayload(jsonNewData, jsonNewDataComp);

【问题讨论】:

  • 你明白sizeof(outComp);是指针的大小,而不是它所指向的大小,comprLen 参数应该是输入时目标压缩缓冲区(即要写入压缩数据的位置)的大小,并且容量应该至少 compressBound(Length)。坦率地说,目标缓冲区的大小应该是 compressPayload 的参数之一,如输入/输出,如果与 compressBound(Length) 相比尺寸过小,则应中止压缩并进行适当的错误处理。
  • @WhozCraig 我已经按照您的建议进行了编辑,但仍然面临相同的结果。总是返回 (-2)。还有什么问题吗?

标签: c++ arduino compression stm32 zlib


【解决方案1】:

经过几天的调查,原因是用于缓冲的内存使用(我只剩下5kb 可用内存,CMIIW)。

deflate.c,我发现了这个:

if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
        windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
        strategy < 0 || strategy > Z_FIXED || (windowBits == 8 && wrap != 1)) {
        return Z_STREAM_ERROR;
}
if (windowBits == 8) windowBits = 9;  /* until 256-byte window bug fixed */

如上所述,在zconf.h 上,我已经将MAX_MEM_LEVEL 的数量降低到1MAX_WBITS5。但看起来MAX_WBITS 的最小值是8(甚至9)。

对于 zlib 的严格内存使用还有其他选择吗?

【讨论】:

  • 答案不是问题的地方。问一个新问题。
  • @Mark Adler 好的,谢谢你,马克。这是我的新问题 > link
猜你喜欢
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多