online - ¿Cómo puedo descomprimir una corriente gzip con zlib?
descomprimir tar.gz online (4)
Los archivos de formato Gzip (creados con el programa gzip
, por ejemplo) usan el algoritmo de compresión "desinflar", que es el mismo algoritmo de compresión que usa zlib . Sin embargo, cuando se usa zlib para inflar un archivo comprimido gzip, la biblioteca devuelve un Z_DATA_ERROR
.
¿Cómo puedo usar zlib para descomprimir un archivo gzip?
pitón
- RFC 1950 (formato comprimido
zlib
) - RFC 1951 (formato comprimido
deflate
) - RFC 1952 (formato comprimido
gzip
)
El módulo python zlib
también los soportará.
elegir windowBits
Pero zlib
puede descomprimir todos esos formatos:
- para (de-) comprimir el formato
deflate
, usewbits = -zlib.MAX_WBITS
- para (des) comprimir el formato
zlib
, usewbits = zlib.MAX_WBITS
- para (des) comprimir formato
gzip
, usewbits = zlib.MAX_WBITS | 16
wbits = zlib.MAX_WBITS | 16
Consulte la documentación en http://www.zlib.net/manual.html#Advanced (sección inflateInit2
)
ejemplos
datos de prueba:
>>> deflate_compress = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS)
>>> zlib_compress = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS)
>>> gzip_compress = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS | 16)
>>>
>>> text = ''''''test''''''
>>> deflate_data = deflate_compress.compress(text) + deflate_compress.flush()
>>> zlib_data = zlib_compress.compress(text) + zlib_compress.flush()
>>> gzip_data = gzip_compress.compress(text) + gzip_compress.flush()
>>>
prueba obvia para zlib
:
>>> zlib.decompress(zlib_data)
''test''
prueba para deflate
:
>>> zlib.decompress(deflate_data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
zlib.error: Error -3 while decompressing data: incorrect header check
>>> zlib.decompress(deflate_data, -zlib.MAX_WBITS)
''test''
prueba para gzip
:
>>> zlib.decompress(gzip_data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
zlib.error: Error -3 while decompressing data: incorrect header check
>>> zlib.decompress(gzip_data, zlib.MAX_WBITS|16)
''test''
los datos también son compatibles con el módulo gzip
:
>>> import gzip
>>> import StringIO
>>> fio = StringIO.StringIO(gzip_data)
>>> f = gzip.GzipFile(fileobj=fio)
>>> f.read()
''test''
>>> f.close()
detección automática de encabezado (zlib o gzip)
windowBits
32
a windowBits
activará la detección de encabezado
>>> zlib.decompress(gzip_data, zlib.MAX_WBITS|32)
''test''
>>> zlib.decompress(zlib_data, zlib.MAX_WBITS|32)
''test''
usando gzip
lugar
Para los datos gzip
con encabezado gzip, puede usar el módulo gzip
directamente; pero recuerda que debajo del capó , gzip
usa zlib
.
fh = gzip.open(''abc.gz'', ''rb'')
cdata = fh.read()
fh.close()
Para descomprimir un archivo de formato gzip con zlib, llame a inflateInit2
con el parámetro windowBits
como 16+MAX_WBITS
, así:
inflateInit2(&stream, 16+MAX_WBITS);
Si no lo hace, zlib se quejará de un formato de flujo incorrecto. De forma predeterminada, zlib crea secuencias con un encabezado zlib, y en inflar no reconoce los diferentes encabezados gzip a menos que así lo indique. Aunque esto se documenta a partir de la versión 1.2.1 del archivo de encabezado zlib.h
, no está en el manual de zlib . Desde el archivo de encabezado:
windowBits
también puede ser mayor que 15 para la decodificación gzip opcional. Agregue 32 awindowBits
para habilitar la decodificación zlib y gzip con detección automática de encabezado, o agregue 16 para decodificar solo el formato gzip (el formato zlib devolverá unZ_DATA_ERROR
). Si se está descodificando una corriente gzip,strm->adler
es un crc32 en lugar de un adler32.
Node.js
const { gunzip } = require(''zlib'');
const decompressGzip = compressedData =>
new Promise((resolve, reject) => {
gunzip(compressedData, (error, decompressedData) => {
if (error) return reject(error);
return resolve(decompressedData);
});
});
module.exports = { decompressGzip };
Instalas zlib
usando hilo
yarn add zlib