Ich habe zlib-komprimierte Daten in Python wie folgt erstellt:
import zlib
s = '...'
z = zlib.compress(s)
with open('/tmp/data', 'w') as f:
f.write(z)
(oder ein Liner in der Schale: echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data
)
Jetzt möchte ich die Daten in der Shell dekomprimieren. Weder zcat
noch uncompress
Arbeit:
$ 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
Es scheint, dass ich eine gzip-ähnliche Datei erstellt habe, aber ohne Header. Leider sehe ich keine Möglichkeit, solche Rohdaten in der gzip-Manpage zu dekomprimieren, und das zlib-Paket enthält kein ausführbares Dienstprogramm.
Gibt es ein Dienstprogramm zum Dekomprimieren von ZLIB-Rohdaten?
compression
gzip
Mykhal
quelle
quelle
Antworten:
Es ist auch möglich, es mit Standard- Shell-Skript + gzip zu dekomprimieren , wenn Sie nicht über OpenSSL oder andere Tools verfügen oder diese verwenden möchten .
Der Trick besteht darin, die magische gzip-Zahl und die Komprimierungsmethode vor die eigentlichen Daten von
zlib.compress
:Bearbeitungen:
@ d0sboots kommentiert: Für RAW-Deflate-Daten müssen Sie 2 weitere Nullbytes hinzufügen:
→
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00"
Dieses Q on SO enthält weitere Informationen zu diesem Ansatz. Eine Antwort darauf deutet darauf hin, dass es auch eine 8-Byte-Fußzeile gibt.
Die Benutzer @ Vitali-Kushner und @ mark-bessey meldeten auch bei abgeschnittenen Dateien Erfolge, sodass eine GZIP-Fußzeile nicht unbedingt erforderlich zu sein scheint.
@ tobias-kienzler schlug diese funktion für den bashrc vor :
zlipd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - $@ |gzip -dc)
quelle
User @tino hat unter der OpenSSL-Antwort einen Kommentar abgegeben, aber ich denke, das sollte separat sein:
Ich habe es versucht und es hat bei mir funktioniert.
zlib-flate
kann im Paket gefunden werdenqpdf
(in Debian Squeeze und Fedora 23, laut Kommentaren in anderen Antworten)quelle
zlib-flate
installiert ? Ich sehe es nirgendwo.qpdf
Paket, das ichbrew
wie im Kommentar oben erwähnt installiert habe - oder schauen Sie sich den letzten Satz dieser Antwort an :). Auchqpdf
ist wirklich cool, haben so einen Blick auf sie zu , wenn Sie Zeit haben!Ich habe eine Lösung gefunden (eine der möglichen), die openssl verwendet :
oder
* HINWEIS: Die zlib-Funktionalität ist anscheinend in neueren openssl-Versionen> = 1.0.0 verfügbar (OpenSSL muss mit der Option zlib oder zlib-dynamic konfiguriert / erstellt werden, letztere ist Standard).
quelle
zlib-flate
imqpdf
Paket. Es kann gerne verwendet werdenzlib-flate -uncompress < FILE
.Ich empfehle pigz von mark adler , mitautor der zlib compression library. Ausführen
pigz
, um die verfügbaren Flags anzuzeigen.Du wirst bemerken:
-z --zlib Compress to zlib (.zz) instead of gzip format.
Sie können mit dem
-d
Flag dekomprimieren :-d --decompress --uncompress Decompress the compressed input.
Angenommen, eine Datei mit dem Namen 'test':
pigz -z test
- Erstellt eine zlib-komprimierte Datei mit dem Namen test.zzpigz -d -z test.zz
- konvertiert test.zz in die dekomprimierte TestdateiUnter OSX können Sie ausführen
brew install pigz
quelle
unpigz test.zz
wird auch funktionieren.$>file hello.txt.zz
hello.txt.zz: zlib compressed data
zlib
Implementiert die von gzip verwendete Komprimierung, jedoch nicht das Dateiformat. Verwenden Sie stattdessen dasgzip
Modul , das selbst verwendet wirdzlib
.quelle
zlib
dekomprimieren und erneut mit komprimierengzip
, wenn Sie nicht über die ursprünglichen Daten verfügen.Das könnte es tun:
Dann führe es so aus:
quelle
zlib.decompress
. Wahrscheinlich würde ich eine Walk-Funktion verwenden. Ich bin nicht sicher, ob Shell meine große Menge an Dateien mit Glob Wildcard behandeln würde :)file
Befehl? Als "zlib-komprimierte Daten" ausgecheckt . Wie ist das?Das
zpipe.c
hier von Mark Adler selbst gefundene Beispielprogramm (das mit der Quelldistribution der zlib-Bibliothek geliefert wird) ist für diese Szenarien mit rohen zlib-Daten sehr nützlich. Kompilieren Sie mitcc -o zpipe zpipe.c -lz
und dekomprimieren:zpipe -d < raw.zlib > decompressed
. Die Komprimierung kann auch ohne das-d
Flag erfolgen.quelle
Unter macOS, einem vollständig POSIX-kompatiblen UNIX (formal zertifiziert!),
OpenSSL
Gibt es keinezlib
Unterstützung,zlib-flate
und während die erste Lösung ebenso wie alle Python-Lösungen funktioniert, müssen sich die ZIP-Daten in einer Datei befinden und alle anderen Lösungen zwingen Sie, ein Python-Skript zu erstellen.Hier ist eine Perl-basierte Lösung, die als einzeilige Befehlszeile verwendet werden kann, deren Eingabe über die STDIN-Pipe erfolgt und die mit einem frisch installierten MacOS sofort funktioniert:
Schöner formatiert sieht das Perl-Skript so aus:
quelle
Sie können dies verwenden, um mit zlib zu komprimieren:
Und dies zu entleeren:
quelle
unknown option '-z'
auf Ubuntu 16.04 undOpenSSL 1.0.2g 1 Mar 2016
funktioniert bei mir auf fedora25
quelle
zcat
Funktioniert nur mit Dateien im gzip-Format.