J'ai créé des données compressées en zlib en Python, comme ceci:
import zlib
s = '...'
z = zlib.compress(s)
with open('/tmp/data', 'w') as f:
f.write(z)
(ou une doublure en-shell: echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data
)
Maintenant, je veux décompresser les données dans un shell. Ni zcat
ni uncompress
travail:
$ 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
Il semble que j'ai créé un fichier de type gzip, mais sans en-tête. Malheureusement, je ne vois aucune option pour décompresser de telles données brutes dans la page de manuel gzip, et le paquet zlib ne contient aucun utilitaire exécutable.
Existe-t-il un utilitaire permettant de décompresser les données brutes zlib?
compression
gzip
Mykhal
la source
la source
Réponses:
Il est également possible de le décompresser en utilisant shell-script standard + gzip , si vous n'en avez pas ou si vous voulez utiliser openssl ou d'autres outils.
L'astuce consiste à ajouter le nombre magique gzip et la méthode de compression aux données réelles de
zlib.compress
:Modifications : @ d0sboots a commenté: pour les données RAW Deflate, vous devez ajouter 2 octets nuls supplémentaires:
→
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00"
Ce Q sur SO donne plus d'informations sur cette approche. Une réponse suggère qu'il existe également un pied de page de 8 octets.
Les utilisateurs @ Vitali-Kushner et @ mark-bessey ont enregistré un succès même avec des fichiers tronqués. Un pied de page gzip ne semble donc pas être absolument nécessaire.
@ tobias-kienzler a suggéré cette fonction pour le bashrc :
zlipd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - $@ |gzip -dc)
la source
L'utilisateur @tino a commenté ci-dessous la réponse OpenSSL mais je pense que cela devrait être séparé:
J'ai essayé cela et cela a fonctionné pour moi.
zlib-flate
peut être trouvé dans le paquetqpdf
(dans Debian Squeeze et Fedora 23, selon les commentaires dans d’autres réponses)la source
zlib-flate
installé sur macOS? Je ne le vois nulle part.qpdf
paquet que j'ai installé avecbrew
comme mentionné dans le commentaire ci - dessus - ou regardez la dernière phrase de cette réponse :). Aussi,qpdf
c'est vraiment cool, alors jetez-y un coup d'œil aussi si vous avez le temps!J'ai trouvé une solution (une des possibles), elle utilise openssl :
ou
* NOTE: La fonctionnalité zlib est apparemment disponible dans les versions récentes d'OpenSL> = 1.0.0 (OpenSSL doit être configuré / construit avec l'option zlib ou zlib-dynamic, cette dernière est la valeur par défaut)
la source
zlib-flate
dans leqpdf
paquet. Il peut être utilisé commezlib-flate -uncompress < FILE
.Je recommande pigz de Mark Adler , co-auteur de la bibliothèque de compression zlib. Exécutez
pigz
pour voir les drapeaux disponibles.Tu remarqueras:
-z --zlib Compress to zlib (.zz) instead of gzip format.
Vous pouvez décompresser en utilisant le
-d
drapeau:-d --decompress --uncompress Decompress the compressed input.
En supposant un fichier nommé 'test':
pigz -z test
- crée un fichier compressé zlib nommé test.zzpigz -d -z test.zz
- convertit test.zz en fichier de test décompresséSur OSX, vous pouvez exécuter
brew install pigz
la source
unpigz test.zz
cela fonctionnera aussi.$>file hello.txt.zz
hello.txt.zz: zlib compressed data
zlib
implémente la compression utilisée par gzip, mais pas le format de fichier. Au lieu de cela, vous devriez utiliser legzip
module , qui lui-même utilisezlib
.la source
zlib
et les recompressergzip
, si vous ne possédez pas encore les données d'origine.Cela pourrait le faire:
Puis lancez ça comme ça:
la source
zlib.decompress
. J'utiliserais probablement une fonction de marche. Je ne suis pas sûr que shell puisse gérer mon énorme quantité de fichiers avec glob wildcard :)file
commande shell ? Comment c'est?L'exemple de programme
zpipe.c
trouvé ici par Mark Adler lui-même (fourni avec la distribution source de la bibliothèque zlib) est très utile pour ces scénarios avec des données brutes zlib. Compiler aveccc -o zpipe zpipe.c -lz
et pour décomprimer:zpipe -d < raw.zlib > decompressed
. Il peut également faire la compression sans le-d
drapeau.la source
Sur macOS, qui est un UNIX entièrement conforme à POSIX (officiellement certifié!),
OpenSSL
N’a aucunzlib
support, il n’existe pas nonzlib-flate
plus et bien que la première solution fonctionne aussi bien que toutes les solutions Python, la première solution nécessite que les données ZIP soient dans un fichier. et toutes les autres solutions vous obligent à créer un script Python.Voici une solution basée sur Perl qui peut être utilisée comme ligne de commande one-line, reçoit son entrée via un tube STDIN et fonctionne immédiatement avec un macOS fraîchement installé:
Plus joliment formaté, le script Perl ressemble à ceci:
la source
Vous pouvez utiliser ceci pour compresser avec zlib:
Et ceci pour dégonfler:
la source
unknown option '-z'
sur Ubuntu 16.04 etOpenSSL 1.0.2g 1 Mar 2016
travaille pour moi sur fedora25
la source
zcat
ne fonctionne qu'avec des fichiers au format gzip.