Execute News

Des nouvelles fraîches de http://www.execute.frRSS « Avant | Après » | Compression[×]

Décompression d'un flux GZIPé

Publié le 23/01/2018 [Delphi] [Compression]
Il est assez frustrant de tomber sur une erreur aussi peu explicite que "data error" quand on cherche à décompresser un flux avec TZDecompressionStream.

Ce que l'aide en ligne ne précise pas, c'est que le paramètre WindowBits permet de spécifier que le flux possède une entête GZIP. Cette entête est facile à identifier, elle commence par la séquence $1F $8B alors que TZCompressionStream produira une entête ZLIB $78 $9C par exemple.

La valeur de WindowBits doit être comprise entre 8 et 15 avec 15 pour le meilleur taux de compression, mais si vous ajouter 16 à cette valeur, ZLib gérera l'entête GZIP.

Moralité, pour décompresser un flux GZIP (commençant par $1F $8B) il faut créer le flux comme ceci GZ := TZDecompressionStream.Create(Source, 31);