использование libgz для раздувания ввода gz - PullRequest
1 голос
/ 13 июня 2010

В настоящее время я пытаюсь использовать zlib для раздувания источника сжатых данных.

Похоже, что API-интерфейс inflate в zlib не может накачать данные gzipped (пример http://www.zlib.net/zpipe.c не может прочитать файл gzipped: "zpipe: недопустимые или неполные данные deflate" ). Я заметил, что в этом API есть функция gzopen , но, насколько я понимаю, она работает только с именем файла или дескриптором файла.

Могу ли я использовать этот API, если мой источник сжатых данных хранится в памяти, в BLB-объекте и т. Д.? ... *

Большое спасибо

Pierre

Ответы [ 4 ]

2 голосов
/ 12 декабря 2012

Вы можете открыть ячейки памяти в виде файлов, используя функцию fmemopen, а затем передать дескриптор этого файла в функцию gzopen.

1 голос
/ 14 июня 2010

Формат gzip просто добавляет простой заголовок (и трейлер) в сжатый поток zlib.Пропустить заголовок не сложно;формат задокументирован в RFC 1952 .

0 голосов
/ 14 января 2014

zlib.h имеет API для распаковки / сжатия буферов данных в памяти, inflateInit2 () позволяет добавить 16 к рекомендованному значению windowBits 15, чтобы распаковать сжатые буферы данных.К сожалению, нет API для считывания ожидаемого количества распакованных байтов из 8-байтового трейлера gzip (4-байтовый CRC Fletcher-32, 4-байтовый размер распакованных данных в байтах).Насколько я могу сказать, вы должны сделать это сами или сделать предположение, а затем изменить размер выходного буфера, если inflate () вернется с Z_BUF_ERROR (недостаточно места в переданном выходном буфере).Если у вас есть весь входной буфер в памяти, используйте флаг сброса Z_FINISH для накачки ().Если у вас достаточно выходной памяти, он вернет Z_STREAM_END, если нет, вернет Z_BUF_ERROR, и вы можете перераспределить ваш выходной буфер и продолжить.

0 голосов
/ 14 июня 2010

В качестве другого решения есть gzdopen - который принимает дескриптор файла.Вы можете получить один для чтения памяти с pipe().Затем вы можете использовать некоторую форму неблокирующих файловых дескрипторов или вспомогательный поток для чтения данных.

Вы можете найти в этом больше проблем, чем оно того стоит: решение Мэтью Слэттери вполне может быть более жизнеспособным.

...