Android InflaterInputStream - это то же самое, что и популярная библиотека ZLIB для Windows? - PullRequest
4 голосов
/ 12 ноября 2011

Я пытаюсь распаковать данные, которые были сжаты с использованием библиотеки ZLIB, написанной Жаном-лупом Гэйли еще в 1990-х годах.Я думаю, что это популярная библиотека (я вижу много программ, которые поставляют файл zlib32.dll, который он использует), поэтому я надеюсь, что кто-то будет достаточно знаком с ней, чтобы помочь мне.Я непосредственно использую функцию compress (), которая из того, что я читаю, использует формат rfc-1951 DEFLATE.

Вот фрагмент кода, который я использую для чтения сжатых данных из потока и его распаковки:

InputStream is = new ByteArrayInputStream(buf);

//GZIPInputStream gzis = new GZIPInputStream(is);

InflaterInputStream iis = new InflaterInputStream(is);

byte[] buf2 = new byte[uncompressedDataLength];

iis.read(buf2);

Функция iis.read (buf2) выдает внутреннее исключение «Ошибка формата данных».Я также пытался использовать GZIPInputStream, но он также выдает то же исключение.

Переменная "buf" - это тип byte [], и я подтвердил отладкой, что это то же самое, что моя программа на C возвращает изФункция ZLIB compress () (фактические данные поступают с сервера через TCP)."uncompressedDataLength" - это известный размер несжатых данных, которые также были предоставлены программой (сервером) на языке C.

Кто-нибудь пробовал читать / записывать данные с использованием этой библиотеки, а затем считывать / записывать те же данные на Android?используя Java?

Я нашел «чистый порт Java ZLIB», на который ссылаются в нескольких местах, и если мне нужно, я могу попробовать это, но я бы предпочел использовать встроенные функции / OS, если это возможно.

1 Ответ

7 голосов
/ 12 ноября 2011

Форматы данных deflate , zlib и gzip в игре здесь все связаны.

Библиотека zlib поддерживает все эти форматы.Java.util.zip Java построен на zlib (как часть реализации / собственных вызовов виртуальной машины) и предоставляет доступ к ним с помощью нескольких классов:

  • Реализация классов Deflater и Inflater -в зависимости от аргумента nowrap для конструктора - форматы данных zlib или deflate .

  • DeflaterOutputStream / DeflaterInputStream / InflaterInputStream /InflaterOutputStream основывается на Deflater / Inflater.В документации не ясно сказано, реализует ли Inflater / Deflater по умолчанию zlib или deflate , но источник показывает, что он использует конструктор Deflater или Inflater по умолчанию, который реализует zlib .

  • GZipOutputStream / GZipInputStream реализуют, как следует из названия, формат gzip .

Я посмотрел исходный код функции zlib compress, и, похоже, он использует формат zlib.Так что ваш код должен делать правильные вещи.Убедитесь, что нет пропущенных данных или дополнительных данных, которые не являются частью блока сжатых данных до или после него.

Отказ от ответственности: Это состояние для Java SE, я полагаю, этоаналогично для Android, но я не могу гарантировать это.

Библиотека jzlib , которую вы нашли (я полагаю), которая является повторной реализацией Java zlib, также реализует все эти форматы данных (gzip был добавлен в последнем обновлении).Для интерактивного использования (на стороне сжатия) это предпочтительнее, так как оно допускает некоторые действия очистки, которые невозможны с классами java.util (кроме использования некоторого обходного пути, такого как изменение уровня сжатия), и это также может быть быстрее, так как избегаетродные вызовы (которые всегда имеют некоторые накладные расходы).

PS: формат файла zip (или pkzip) также связан: он использует deflate внутри для каждого файла в архиве.

...