Использование zlib deflateBound () динамически - PullRequest
0 голосов
/ 06 февраля 2019

Я искал, как динамически использовать deflateBound (), и не нашел именно то, что ищу.

Я посмотрел руководство по zlip, примеры включены в библиотеку и нашел их здесь: Библиотеки сжатия для ARM Cortex M3 / 4 Определите размер сжатого / несжатого буфера для Z-lib в C zlib, deflate: Сколько памяти выделить?

Чего мне не хватает, это как распределить после вызова deflateBound ().Например, это выглядит так, как будто это вызовет проблемы

   z_stream defstream;
   uint8_t *outBuf=NULL;
   uint32_t outLen=0;

   defstream.zalloc = Z_NULL;
   defstream.zfree = Z_NULL;
   defstream.opaque = Z_NULL;
   defstream.avail_in = (uInt)inLen;
   defstream.next_in = (Bytef *)inBuf:
   defstream.avail_out = (uInt)0;
   defstream.next_out = (Bytef *)outBuf;

   deflateInit(&defstream, Z_DEFAULT_COMPRESSION);
   uint32_t  estimateLen = deflateBound(&defstream, inLen);
   outBuf = malloc(estimateLen);
   defstream.avail_out = (uInt)estimateLen;
   deflate(&defstream, Z_FINISH);
   deflateEnd(&defstream);

Я вижу упоминание realloc, это означает, что рекомендуется начинать с начального (возможно, слишком малого) буфера?

   z_stream defstream;
   uint8_t *outBuf=NULL;
   uint32_t outLen=100;
   outBuf = malloc(outLen);

   defstream.zalloc = Z_NULL;
   defstream.zfree = Z_NULL;
   defstream.opaque = Z_NULL;
   defstream.avail_in = (uInt)inLen;
   defstream.next_in = (Bytef *)inBuf:
   defstream.avail_out = (uInt)outLen;
   defstream.next_out = (Bytef *)outBuf;

   deflateInit(&defstream, Z_DEFAULT_COMPRESSION);
   uint32_t  estimateLen = deflateBound(&defstream, inLen);
   outBuf = realloc(outBufestimateLen);
   defstream.avail_out = (uInt)estimateLen;
   deflate(&defstream, Z_FINISH);
   deflateEnd(&defstream);

Бытьвстроенная система, я пытаюсь упростить задачу

1 Ответ

0 голосов
/ 07 февраля 2019

В обоих примерах вы не устанавливаете next_out после deflateBound().Вам нужно defstream.next_out = (Bytef *)outBuf; после malloc().

Вам не нужно делать realloc().

...