zlib: как определить размер - PullRequest
       67

zlib: как определить размер

1 голос
/ 08 февраля 2011

Я хотел бы сжать небольшой блок памяти (<= 16 КиБ), используя zlib.Вывод также сохраняется в блоке памяти.<em> Нет доступа к диску или базе данных здесь.

В соответствии с документацией, я должен повторно вызывать deflate(), пока весь ввод не будет сдут.Между тем мне нужно увеличить размер блока памяти, куда направляется вывод.

Однако это кажется излишне сложным и, возможно, даже неэффективным.Поскольку я знаю размер ввода, я не могу заранее определить максимальный размер, необходимый для вывода, а затем сделать все одним вызовом deflate()?

Если так, каков максимальный размер вывода?Я предполагаю что-то вроде: размер ввода + несколько байтов накладных расходов

1 Ответ

7 голосов
/ 09 февраля 2011

В zlib есть функция для расчета максимального размера, до которого будет сдуваться буфер.Ваше предположение верно - возвращаемое значение - это размер входного буфера + размеры заголовка.После дефляции вы можете перераспределить буфер, чтобы восстановить «потерянную» память.
Из zlib.h:

ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, uLong sourceLen));
/*
   deflateBound() returns an upper bound on the compressed size after
   deflation of sourceLen bytes.  It must be called after deflateInit() or
   deflateInit2(), and after deflateSetHeader(), if used.  This would be used
   to allocate an output buffer for deflation in a single pass, and so would be
   called before deflate().
*/
...