2011-02-08 2 views
1

Я хотел бы сдуть небольшой блок памяти (< = 16 KiB) с помощью zlib. Выход также сохраняется в блоке памяти. No доступ к дискам или базе данных здесь.zlib: как измерять avail_out

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

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

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

ответ

7

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(). 
*/ 
Смежные вопросы