Распакуйте сжатую zlib строку в Java - PullRequest
2 голосов
/ 04 апреля 2011

У меня есть модуль Java, который получает сжатую строку из удаленного скрипта Python. Скрипт Python сжимает строку, используя zlib.compress(). Я просто хочу распаковать его в Java и показать его пользователю.

Справочная страница для встроенного в Java объекта zip.Deflater довольно подробно описывает, как распаковать что-то, что было сжато с использованием zlib.compress(). Однако этот метод не работает для меня. В зависимости от того, какую кодировку я использую, я получаю либо ошибки «Неправильная проверка заголовка», либо распаковка возвращает пустую строку.

Итак, как мне это распаковать? При передаче данные не повреждаются, и сжатая строка начинается с «x \ x9c», что, по-видимому, подходит для zlib-сжатых файлов.

Я никогда раньше не имел дело со сжатием / распаковкой на этом уровне, и я запутался. Для дополнительного кредита я был бы признателен за объяснение между сжатым / несжатым и раздутым / спущенным. Согласно это они разные, но большая часть интернета, кажется, использует их взаимозаменяемо для zlib. Это только делает попытку найти решение еще более трудной, поскольку я не могу сказать вам, пытаюсь ли я на самом деле «распаковать» или «раздуть» эти данные.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Путаница возникла из-за того, что какая-то яркая искра начала описывать протокол zlib как "deflate". Это может помочь вам прочитать RFC, упомянутые в этих документах Java .

Также эта тема SO весьма актуальна.

Я предлагаю вам сделать

print repr(zlib.compress("The quick brown dog etc etc")

в Python (A) и сравните результат с использованием эквивалентного кода Java, используя Deflater (B). Также убедитесь, что вы можете накачать B, чтобы восстановить тестовый ввод. Убедитесь, что вы не страдаете от юникодных <-> байтовых сложностей в Python или Java или обоих.

Вы пытались сделать Python "дефлятом" в соответствии с ответом @patthoyts в теме SO, которую вы цитировали?

0 голосов
/ 04 апреля 2011

Кажется, Python zlib.compress() использует gzip, вы уверены, что создадите Inflater с параметром nowrap для gzip-совместимой несжатия?

Inflate / deflate используется только в отношении алгоритма DEFLATE, я считаю, тогда как сжатие / распаковка - более общий термин.

...