Я думаю, что документация действительно ясна об этом
ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen));
Распаковывает исходный буфер в целевой буфер.sourceLen - длина байта исходного буфера. При входе destLen - это общий размер буфера назначения, который должен быть достаточно большим, чтобы вместить все несжатые данные.(Размер несжатых данных должен быть предварительно сохранен компрессором и передан в декомпрессор каким-либо механизмом вне области действия этой библиотеки сжатия.) При выходе destLen - это фактический размер несжатых данных.
uncompress возвращает Z_OK в случае успеха, Z_MEM_ERROR, если не было достаточно памяти, Z_BUF_ERROR, если в выходном буфере недостаточно места, или Z_DATA_ERROR, если входные данные были повреждены или неполны.В случае, когда недостаточно места, uncompress () заполнит выходной буфер несжатыми данными до этой точки.
Поэтому zlib рекомендует отправлять несжатый размер вместе со сжатым потоком.
Но мы также можем отметить предложение
В случае, когда недостаточно места, uncompress () заполнит выходной буфер несжатыми данными до этой точки.
Таким образом, вы можете включить длину в сжатое сообщение в начале.Затем в пункте назначения начните распаковку с небольшого буфера.Это не может распаковать все в маленький буфер.Но он будет достаточно распакован, чтобы вы могли прочитать длину данных, если вы записали ее в начале.Затем вы можете использовать это для выделения / изменения размера буфера назначения и снова использовать распаковку.
В зависимости от вашего варианта использования это может быть хорошей идеей или нет.Если размеры вашего сообщения не сильно различаются и программа работает дольше, может быть, лучше просто сохранить один целевой буфер и просто увеличивать его по мере необходимости.