2014-09-04 2 views
0

У меня возникла проблема с распаковкой некоторых данных gzip. У меня есть массив с указателями на динамически выделенные строки символов. Каждый элемент этого массива является частью файла gzip, который я хочу распаковать. Первое, что приходит мне на ум, - объединить эти строки в один, а затем распаковать данные, но я хочу избежать этого метода из-за большого количества копий.gzip декомпрессии с использованием библиотеки zlib

Итак, вопрос в том, есть ли способ распаковать данные, разделенные на несколько частей, используя библиотеку zlib? Я пытался это сделать, но когда я распаковываю первую часть, я получаю Z_DATA_ERROR - и это нормально, потому что данные не завершены. Есть ли способ «ждать», чтобы остальные данные распаковывались?

+1

Вы видели это? https://hewgill.com/journal/entries/349-how-to-decompress-gzip-stream-with-zlib Вы должны иметь возможность называть 'inflate()' несколько раз с кусками для распаковки один за другим .. .. –

+0

Да, у меня нет проблем с распаковкой gzip-файла, когда он находится в одном куске. Мне просто интересно, что делать, когда у меня есть это в нескольких частях. Я хотел сделать это один за другим, но когда я декомпрессию первой части, я получаю Z_DATA_ERROR, потому что он не является полным, поэтому он не распакован – user3131037

+1

Проверьте [дополнительные функции в ссылке] (http: //www.zlib .net/manual.html # Advanced), там вы найдете функцию 'inflateBack', которая использует обратные вызовы для чтения и записи данных. –

ответ

1

Да. Вы можете просто позвонить inflate() последовательно с каждой строкой в ​​соответствующем порядке. для каждого вызова inflate() вы можете указать другой указатель и длину для сжатых данных. Каждый раз убедитесь, что вы сначала потребляете все несжатые данные, и avail_in равен нулю, прежде чем перейти к следующему фрагменту ввода.

Если вы получаете Z_DATA_ERROR, это означает, что либо вы не правильно собираете исходный поток, либо исходный поток не является потоком gzip.

Обратите внимание, что для распаковки потока gzip вам необходимо инициализировать с помощью inflateInit2() и соответствующим образом задать параметры для запроса декомпрессии gzip.

Смежные вопросы