104 votes

Comment puis-je décompresser un flux gzip avec zlib ?

Les fichiers au format gzip (créé avec le de programme, par exemple) utiliser l’algorithme de compression « deflate », qui est le même algorithme de compression comme quel [zlib](http://www.zlib.net/) utilise. Toutefois, lorsque vous utilisez zlib pour gonfler un fichier compressé gzip, la bibliothèque retourne un .

Comment puis-je utiliser zlib pour décompresser un fichier gzip ?

113voto

Greg Hewgill Points 356191

Pour décompresser un gzip format de fichier avec zlib, appelez - inflateInit2 avec l' windowBits paramètre 16+MAX_WBITS, comme ceci:

inflateInit2(&stream, 16+MAX_WBITS);

Si vous ne le faites pas, zlib va se plaindre d'un mauvais format de flux de données. Par défaut, zlib crée des cours d'eau avec un zlib-tête, et sur le gonfler de ne pas reconnaître les différentes gzip-tête, à moins que vous le dire. Bien que cela est documenté à partir de la version 1.2.1 de l' zlib.h fichier d'en-tête, il n'est pas dans la zlib manuel. À partir du fichier d'en-tête:

windowBits peut également être supérieure à 15 pour facultatif gzip décodage. Ajouter 32 windowBits afin de permettre zlib et gzip décodage automatique de l'en-tête de détection, ou ajouter de 16 à décoder uniquement le format gzip (zlib format de retour d'un Z_DATA_ERROR). Si un gzip flux décodés, strm->adlerest un crc32 au lieu d'une adler32.

100voto

dnozay Points 3672

python

zlib bibliothèque prend en charge:

Le python zlib module de soutien de ces derniers.

le choix de windowBits

Mais zlib pouvez décompresser tous ces formats:

  • pour la (dé-)compresser deflate format, l'utilisation de wbits = -zlib.MAX_WBITS
  • pour la (dé-)compresser zlib format, l'utilisation de wbits = zlib.MAX_WBITS
  • pour la (dé-)compresser gzip format, l'utilisation de wbits = zlib.MAX_WBITS | 16

Voir la documentation en http://www.zlib.net/manual.html#Advanced (section inflateInit2)

exemples

données de test:

>>> 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()
>>> 

évident test pour zlib:

>>> zlib.decompress(zlib_data)
'test'

test pour 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'

test pour 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'

les données sont également compatibles avec d' gzip module de:

>>> import gzip
>>> import StringIO
>>> fio = StringIO.StringIO(gzip_data)
>>> f = gzip.GzipFile(fileobj=fio)
>>> f.read()
'test'
>>> f.close()

automatique de la tête de détection (zlib ou gzip)

l'ajout d' 32 de windowBits va déclencher tête de détection

>>> zlib.decompress(gzip_data, zlib.MAX_WBITS|32)
'test'
>>> zlib.decompress(zlib_data, zlib.MAX_WBITS|32)
'test'

à l'aide de gzip au lieu

Pour gzip de données à l'aide de gzip-tête, vous pouvez utiliser gzip module directement; mais rappelez-vous que sous le capot, gzip utilise zlib.

fh = gzip.open('abc.gz', 'rb')
cdata = fh.read()
fh.close()

2voto

josep fon Points 21

La structure de zlib et gzip est différente. zlib utilise RFC 1950 et gzip utilise RFC 1952, donc différents en-têtes mais les autres ont la même structure et suit le RFC 1951.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X