Comment compresser en zlib et encoder en Base64
- Saisissez ou collez le texte, ou déposez un fichier.
- Format démarre sur zlib (deflate). Passez à Deflate brut quand le destinataire veut le flux nu, ou à gzip.
- Cochez éventuellement URL-safe (- _) ou Couper à 76.
- Copier la sortie, ou téléchargez le
.txtBase64 ou le fichier binaire.zz/.deflate.
Inverser envoie la sortie du côté Décompresser pour confirmer l’aller-retour.
Le même texte dans trois enveloppes
Hello, world! (13 octets), compressé au niveau par défaut :
| Format | Octets | Base64 |
|---|---|---|
| deflate brut | 15 | 80jNycnXUSjPL8pJUQQA |
| zlib | 21 | eJzzSM3JyddRKM8vyklRBAAgXgSK |
| gzip | 33 | H4sIAAAAAAAAA/NIzcnJ11Eozy/KSVEEAObG5usNAAAA |
Le flux deflate est le même, 15 octets, dans les trois cas, et pourtant le Base64 a l’air différent, car les en-têtes de 2 et 10 octets décalent la place de chaque octet dans les groupes de 3. L’en-tête zlib vaut 78 9C au niveau par défaut, d’où le début eJ du Base64 zlib. Au niveau 9, il vaut 78 DA, soit eN en Base64.
Quel appel produit quel format
La plupart des bugs de « deflate » viennent de deux côtés qui emploient le même mot pour des enveloppes différentes :
| Langage | zlib (RFC 1950) | deflate brut (RFC 1951) | gzip |
|---|---|---|---|
| Python | zlib.compress() | zlib.compressobj(wbits=-15) | gzip.compress() |
| Node.js | zlib.deflateSync() | zlib.deflateRawSync() | zlib.gzipSync() |
| Navigateur | CompressionStream("deflate") | CompressionStream("deflate-raw") | CompressionStream("gzip") |
| PHP | gzcompress() | gzdeflate() | gzencode() |
| Java | new Deflater() | new Deflater(level, true) | GZIPOutputStream |
| .NET | ZLibStream (.NET 6+) | DeflateStream | GZipStream |
| Go | compress/zlib | compress/flate | compress/gzip |
Attention aux pièges : le DeflateStream de .NET et le compress/flate de Go sont bruts, alors que le « deflate » de Node et du navigateur est du zlib. Un service C# et un client Node qui « utilisent deflate » tous les deux ne se comprendront pas sans modification d’un côté.
Où apparaît chaque enveloppe
- zlib : flux
FlateDecodedes PDF, données d’image PNG, objets Git, nombreux protocoles binaires et formats de sauvegarde de jeux. - deflate brut : le binding SAML HTTP-Redirect (le décodeur SAML le gère), les entrées des fichiers ZIP, le
permessage-deflatedes WebSocket. - gzip : fichiers, HTTP, logs. La page gzip le couvre.
Zlib + Base64 dans le code
import base64, zlib
packed = base64.b64encode(zlib.compress(b"Hello, world!")).decode()
# 'eJzzSM3JyddRKM8vyklRBAAgXgSK'
text = zlib.decompress(base64.b64decode(packed))
// Node.js: raw deflate for a SAML-style payload
const zlib = require("zlib");
const packed = zlib.deflateRawSync(Buffer.from("Hello, world!")).toString("base64");
// '80jNycnXUSjPL8pJUQQA'
Pour relire de telles chaînes, utilisez le décodeur Base64 gzip et zlib, qui détecte les trois enveloppes. Plus de détails sur les pages Python et Node.js.
Problèmes courants
incorrect header check: décodeur zlib, données brutes ou gzip. Accordez l’enveloppe.invalid stored block lengthsouinvalid block type: décodeur de deflate brut alimenté avec du zlib ; les deux octets d’en-tête sont lus comme des blocs deflate.- Le résultat est plus long que l’entrée : les chaînes courtes ne se compressent pas. En dessous d’environ 50 à 100 octets, le Base64 simple est plus court.
- La sortie ne correspond pas octet pour octet à celle d’un autre outil : le niveau de compression comme la bibliothèque changent les octets, et tout décompresseur correct renvoie le même original dans les deux cas.
FAQ
Quelle différence entre zlib et deflate ?
Deflate est l’algorithme de compression. Le deflate brut est le flux compressé seul ; zlib l’entoure d’un en-tête de 2 octets et d’une somme de contrôle Adler-32 de 4 octets ; gzip ajoute un en-tête de 10 octets et une fin de 8 octets avec un CRC-32. Les données compressées au milieu sont identiques.
D'où vient l'erreur « incorrect header check » ?
Le décompresseur attendait un en-tête zlib et a reçu autre chose, le plus souvent du deflate brut ou du gzip. Utilisez l’appel correspondant (zlib.decompress(data, -15) en Python pour du deflate brut) ou réencodez dans le format qu’attend le destinataire.
HTTP Content-Encoding: deflate, c'est du deflate brut ou du zlib ?
La spécification HTTP dit zlib. Certains anciens serveurs envoyaient du deflate brut sous ce nom : c’est pourquoi gzip est le choix le plus sûr pour HTTP.