Комментарии к вопросу являются ответами, поэтому просто запишите их здесь для потомков ...
dest.size()
нет и не может быть изменено с помощью deflate()
. Все, что вы получаете от dest.size()
, это размер буфера вывода до сжатия . Вам нужно взглянуть на что-то , которое возвращается из вызова deflate()
, чтобы определить размер сжатого результата. Это может быть либо dest.size() - strm.avail_out
, либо strm.total_out
.
Выполнение сжатия за один вызов означает, что вам нужно уместить размер входного и выходного буфера в unsigned
, который обычно составляет 32 бита. Таким образом, вы ограничены сжатием около 4 ГБ данных. Если вам может потребоваться сделать больше, вам понадобится цикл, вызывающий deflate()
для небольших кусков. Возможно, намного меньшие куски, измеренные в 10 или 100 Кбайт. Это обычный способ использования deflate()
, так как он занимает гораздо меньше памяти и не позволяет вашей рутине быть ресурсом в этом отношении.
deflateBound()
специально для поддержки использования одного deflate()
вызова. Он обеспечивает верхнюю границу для возможного сжатого размера, который может быть на больше , чем входные данные. Это тот случай, когда входные данные несжимаемы, например, уже сжатый или случайный.