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 zcat
ni uncompress
trabajo:
$ 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-flate
se puede encontrar en el paqueteqpdf
(en Debian Squeeze y Fedora 23, según los comentarios en otras respuestas)fuente
zlib-flate
instalaste en macOS? No lo veo en ningún lado.qpdf
paquete que instalébrew
como se menciona en el comentario anterior , o mire la última oración de esta respuesta :). Además,qpdf
es 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-flate
en elqpdf
paquete. Se puede usar comozlib-flate -uncompress < FILE
.Recomiendo pigz de Mark Adler , coautor de la biblioteca de compresión zlib. Ejecute
pigz
para ver las banderas disponibles.Te darás cuenta:
-z --zlib Compress to zlib (.zz) instead of gzip format.
Puede descomprimir usando la
-d
bandera:-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 pigz
fuente
unpigz test.zz
lo que funcionará también.$>file hello.txt.zz
hello.txt.zz: zlib compressed data
zlib
implementa la compresión utilizada por gzip, pero no el formato de archivo. En su lugar, debe usar elgzip
módulo , que también usazlib
.fuente
zlib
y recomprimirlosgzip
si 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 :)file
comando de shell ? ¿Como es eso?El programa de ejemplo
zpipe.c
encontrado 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 -lz
y para descomprimir:zpipe -d < raw.zlib > decompressed
. También puede hacer la compresión sin la-d
bandera.fuente
En macOS, que es un UNIX completo compatible con POSIX (¡certificado formalmente!), No
OpenSSL
tienezlib
soporte,zlib-flate
tampoco 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 2016
funciona para mí en fedora25
fuente
zcat
solo funciona con archivos en formato gzip.