Понял: рация на бронетранспортере.
Дело в том, что сжаты не пакеты, а поток (TCP - потоковый протокол). Т.ч. сперва придется собрать поток. Даже частичное декодирование можно выполнить только начиная с начала потока.
Библиотека zlib сишная.
Самое простое - декодировать все данные сразу (функция uncompress):
http://zlib.net/manual.html#UtilityЕсли нужно декодировать поток:
Контекст хранится в структуре z_stream:
http://zlib.net/manual.html#StreamСтруктуру надо заполнить, проинициализировать (inflateInit), по добалению данных вызывать deflate и в конце закрыть (deflateEnd).
http://zlib.net/manual.html#BasicВ комплекте с zlib идет пример: example.c
Оттуда пример:
void test_deflate(compr, comprLen)
Byte *compr;
uLong comprLen;
{
z_stream c_stream; /* compression stream */
int err;
uLong len = (uLong)strlen(hello)+1;
c_stream.zalloc = (alloc_func)0;
c_stream.zfree = (free_func)0;
c_stream.opaque = (voidpf)0;
err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
CHECK_ERR(err, "deflateInit");
c_stream.next_in = (Bytef*)hello;
c_stream.next_out = compr;
while (c_stream.total_in != len && c_stream.total_out < comprLen) {
c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
err = deflate(&c_stream, Z_NO_FLUSH);
CHECK_ERR(err, "deflate");
}
/* Finish the stream, still forcing small buffers: */
for (;;) {
c_stream.avail_out = 1;
err = deflate(&c_stream, Z_FINISH);
if (err == Z_STREAM_END) break;
CHECK_ERR(err, "deflate");
}
err = deflateEnd(&c_stream);
CHECK_ERR(err, "deflateEnd");
}