Я создал zlib-сжатые данные в Python, вот так:
import zlib
s = '...'
z = zlib.compress(s)
with open('/tmp/data', 'w') as f:
f.write(z)
(или один вкладыш в оболочке: echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data
)
Теперь я хочу распаковать данные в оболочке. Ни , zcat
ни uncompress
работа:
$ cat /tmp/data | gzip -d -
gzip: stdin: not in gzip format
$ zcat /tmp/data
gzip: /tmp/data.gz: not in gzip format
$ cat /tmp/data | uncompress -
gzip: stdin: not in gzip format
Кажется, я создал gzip-подобный файл, но без заголовков. К сожалению, я не вижу никакой возможности распаковать такие необработанные данные на man-странице gzip, и пакет zlib не содержит никакой исполняемой утилиты.
Есть ли утилита для распаковки сырых данных zlib?
compression
gzip
mykhal
источник
источник
Ответы:
Также можно распаковать его, используя стандартный shell-скрипт + gzip , если у вас его нет, или вы хотите использовать openssl или другие инструменты.
Хитрость заключается в том, чтобы добавить магический номер gzip и метод сжатия к фактическим данным из
zlib.compress
:Изменения:
@ d0sboots прокомментировал: Для данных RAW Deflate вам нужно добавить еще 2 нулевых байта:
→
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00"
Этот вопрос о SO дает больше информации об этом подходе. Ответ там предполагает, что есть также 8-байтовый нижний колонтитул.
Пользователи @ Vitali-Kushner и @ mark-bessey сообщили об успехе даже с усеченными файлами, поэтому нижний колонтитул gzip не кажется строго обязательным.
@ tobias-kienzler предложил эту функцию для bashrc :
zlipd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - $@ |gzip -dc)
источник
Пользователь @tino прокомментировал ниже ответ OpenSSL, но я думаю, что это должно быть отдельным:
Я попробовал это, и это сработало для меня.
zlib-flate
можно найти в пакетеqpdf
(в Debian Squeeze и Fedora 23, согласно комментариям в других ответах)источник
zlib-flate
установили на MacOS? Я этого нигде не вижу.qpdf
пакетом, который я установил,brew
как упомянуто в комментарии выше - или посмотрите на последнее предложение этого ответа :). Кроме того,qpdf
это действительно круто, так что посмотрите на это тоже, если у вас есть время!Я нашел решение (одно из возможных), оно использует openssl :
или же
* ПРИМЕЧАНИЕ: функциональность zlib, по-видимому, доступна в последних версиях openssl> = 1.0.0 (OpenSSL должен быть настроен / собран с опцией zlib или zlib-dynamic, последняя используется по умолчанию)
источник
zlib-flate
вqpdf
пакете. Это можно использовать какzlib-flate -uncompress < FILE
.Я рекомендую pigz от Марка Адлера , соавтора библиотеки сжатия zlib. Выполните,
pigz
чтобы увидеть доступные флаги.Ты заметишь:
-z --zlib Compress to zlib (.zz) instead of gzip format.
Вы можете распаковать, используя
-d
флаг:-d --decompress --uncompress Decompress the compressed input.
Предполагая файл с именем «тест»:
pigz -z test
- создает сжатый zlib файл с именем test.zzpigz -d -z test.zz
- преобразует test.zz в распакованный тестовый файлНа OSX вы можете выполнить
brew install pigz
источник
unpigz test.zz
будет работать.$>file hello.txt.zz
hello.txt.zz: zlib compressed data
zlib
реализует сжатие, используемое gzip, но не формат файла. Вместо этого вы должны использоватьgzip
модуль , который сам используетzlib
.источник
zlib
и повторно сжать ихgzip
, если у вас еще нет исходных данных.Это может сделать это:
Затем запустите это так:
источник
zlib.decompress
. вероятно, я бы использовал функцию ходьбы. я не уверен, что оболочка обработает мое огромное количество файлов сfile
? Как так?Пример программы,
zpipe.c
найденной здесь самим Марком Адлером (поставляется с исходным дистрибутивом библиотеки zlib), очень полезен для этих сценариев с необработанными данными zlib. Компилироватьcc -o zpipe zpipe.c -lz
и распаковыватьzpipe -d < raw.zlib > decompressed
. Это может также сделать сжатие без-d
флага.источник
В macOS, которая полностью совместима с POSIX, UNIX (формально сертифицирован!) Не
OpenSSL
имеетzlib
поддержки, ее тоже нет,zlib-flate
и хотя первое решение работает так же, как и все решения Python, первое решение требует, чтобы данные ZIP находились в файле. и все остальные решения вынуждают вас создавать скрипт Python.Вот решение на основе Perl, которое можно использовать как однострочник командной строки, получать входные данные через канал STDIN и работать из коробки с недавно установленной macOS:
В более отформатированном виде скрипт Perl выглядит так:
источник
Вы можете использовать это для сжатия с помощью zlib:
И это, чтобы спустить
источник
unknown option '-z'
на Ubuntu 16.04 иOpenSSL 1.0.2g 1 Mar 2016
у меня работает на fedora25
источник
zcat
работает только с файлами в формате gzip.