He creado datos comprimidos zlib en Python, así:
import zlib
s = '...'
z = zlib.compress(s)
with open('/tmp/data', 'w') as f:
f.write(z)
(o de una sola línea en shell: echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data)
Ahora, quiero descomprimir los datos en shell. Ni zcatni uncompresstrabajo:
$ 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
Parece que he creado un archivo tipo gzip, pero sin encabezados. Desafortunadamente, no veo ninguna opción para descomprimir dichos datos sin procesar en la página de manual de gzip, y el paquete zlib no contiene ninguna utilidad ejecutable.
¿Hay alguna utilidad para descomprimir datos en bruto zlib?
compression
gzip
mykhal
fuente
fuente

Respuestas:
También es posible descomprimirlo usando shell-script + gzip estándar , si no tiene, o si desea usar openssl u otras herramientas.
El truco consiste en anteponer el número mágico gzip y el método de compresión a los datos reales de
zlib.compress:Ediciones:
@ d0sboots comentó: para los datos RAW Deflate, debe agregar 2 bytes nulos más:
→
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00"Esta Q sobre SO proporciona más información sobre este enfoque. Una respuesta allí sugiere que también hay un pie de página de 8 bytes.
Los usuarios @ Vitali-Kushner y @ mark-bessey informaron de éxito incluso con archivos truncados, por lo que no parece estrictamente necesario un pie de página de gzip.
@ tobias-kienzler sugirió esta función para el bashrc :
zlipd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - $@ |gzip -dc)fuente
El usuario @tino comentó a continuación la respuesta de OpenSSL, pero creo que esto debería estar separado:
Intenté esto y funcionó para mí.
zlib-flatese puede encontrar en el paqueteqpdf(en Debian Squeeze y Fedora 23, según los comentarios en otras respuestas)fuente
zlib-flateinstalaste en macOS? No lo veo en ningún lado.qpdfpaquete que instalébrewcomo se menciona en el comentario anterior , o mire la última oración de esta respuesta :). Además,qpdfes realmente genial, ¡así que échale un vistazo si tienes tiempo!He encontrado una solución (una de las posibles), está usando openssl :
o
* NOTA: la funcionalidad zlib aparentemente está disponible en versiones recientes de openssl> = 1.0.0 (OpenSSL tiene que configurarse / construirse con la opción zlib o zlib-dynamic, esta última es la predeterminada)
fuente
zlib-flateen elqpdfpaquete. Se puede usar comozlib-flate -uncompress < FILE.Recomiendo pigz de Mark Adler , coautor de la biblioteca de compresión zlib. Ejecute
pigzpara ver las banderas disponibles.Te darás cuenta:
-z --zlib Compress to zlib (.zz) instead of gzip format.Puede descomprimir usando la
-dbandera:-d --decompress --uncompress Decompress the compressed input.Suponiendo un archivo llamado 'prueba':
pigz -z test- crea un archivo comprimido zlib llamado test.zzpigz -d -z test.zz- convierte test.zz al archivo de prueba descomprimidoEn OSX puedes ejecutar
brew install pigzfuente
unpigz test.zzlo que funcionará también.$>file hello.txt.zzhello.txt.zz: zlib compressed datazlibimplementa la compresión utilizada por gzip, pero no el formato de archivo. En su lugar, debe usar elgzipmódulo , que también usazlib.fuente
zliby recomprimirlosgzipsi aún no tiene los datos originales.Esto podría hacerlo:
Luego ejecútelo así:
fuente
zlib.decompress. probablemente usaría alguna función de caminar. No estoy seguro de si Shell manejaría mi gran cantidad de archivos con comodín glob :)filecomando de shell ? ¿Como es eso?El programa de ejemplo
zpipe.cencontrado aquí por el propio Mark Adler (viene con la distribución fuente de la biblioteca zlib) es muy útil para estos escenarios con datos zlib sin procesar. Compilar concc -o zpipe zpipe.c -lzy para descomprimir:zpipe -d < raw.zlib > decompressed. También puede hacer la compresión sin la-dbandera.fuente
En macOS, que es un UNIX completo compatible con POSIX (¡certificado formalmente!), No
OpenSSLtienezlibsoporte,zlib-flatetampoco lo hay , y aunque la primera solución funciona tan bien como todas las soluciones de Python, la primera solución requiere que los datos ZIP estén en un archivo y todas las demás soluciones te obligan a crear un script de Python.Aquí hay una solución basada en Perl que se puede usar como línea de comando, obtiene su entrada a través de la tubería STDIN y funciona de forma inmediata con un macOS recién instalado:
Mejor formateado, el script de Perl se ve así:
fuente
Puede usar esto para comprimir con zlib:
Y esto para desinflar:
fuente
unknown option '-z'en Ubuntu 16.04 yOpenSSL 1.0.2g 1 Mar 2016funciona para mí en fedora25
fuente
zcatsolo funciona con archivos en formato gzip.