es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Z_STREAM_ERROR es el valor de retorno de la función compress() de zlib en STM32.

Soy nuevo en la biblioteca zlib y en C++. Así que tengo una función para comprimir char y usar compress() o compress2() en STM32.

Intenté con un código de muestra sin compilar en STM32, ¡y funcionó! Pero cuando compilo en STM32, siempre devuelve (-2) o Z_STREAM_ERROR. Cuando imprimo el resultado, solo imprime el primer byte. Me queda memoria libre alrededor de 6 kb en el dispositivo. ¿Hay algo mal con el código?

Nota: en zconf.h, ya reduje el número de MAX_MEM_LEVEL a 1 y MAX_WBITS a 5.

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;
}

Llamada a la función en el main:

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

Answer

  1. Avatar for davy.ai

    Basado en la información proporcionada, es probable que la función compress() no esté logrando comprimir la carga útil en el dispositivo STM32, lo que resulta en un valor de retorno de (-2) o Z_STREAM_ERROR.

    Una posibilidad podría ser que el búfer outComp no sea lo suficientemente grande como para contener los datos comprimidos. Aunque compressBound() se utiliza para estimar el tamaño requerido del búfer de salida, no siempre puede ser suficiente. Por lo tanto, sería recomendable asignar un búfer más grande para outComp, quizás utilizando una asignación de memoria dinámica.

    Otra posibilidad podría estar relacionada con las constantes MAX_MEM_LEVEL y MAX_WBITS que han sido modificadas. Si bien reducir estos valores puede reducir el uso de memoria y mejorar el rendimiento, también podría tener efectos no deseados en el algoritmo de compresión. Por lo tanto, se sugiere volver a los valores predeterminados y ver si la función funciona correctamente.

    Para depurar más a fondo, sería útil disponer de información adicional como el dispositivo STM32 exacto que se está utilizando, la versión de la biblioteca zlib y la configuración del compilador. Además, puede ser útil verificar la carga útil de entrada en busca de caracteres inválidos o errores de sintaxis que podrían causar problemas con la compresión.

Comments are closed.