Comment compresser en gzip et encoder en Base64
- Saisissez ou collez du texte dans l’entrée, ou déposez un fichier. En direct est activé : la sortie se met à jour pendant la saisie.
- Laissez Format sur gzip. zlib, deflate brut et, si le navigateur le prend en charge, Brotli figurent dans la même liste.
- Cochez URL-safe (- _) si la chaîne va dans une URL ou un nom de fichier, ou Couper à 76 pour des longueurs de ligne de type e-mail ou PEM.
- Copier la sortie, Télécharger le Base64 dans un fichier
.txt, ou Télécharger le fichier compressé pour enregistrer le.gzbinaire.
La ligne d’infos affiche la taille de l’entrée, la taille compressée, la taille du Base64 et le taux, et le message d’état indique de combien le résultat est plus court ou plus long que le Base64 simple de la même entrée.
Quand compresser d’abord vaut la peine
Base64 fait toujours grossir les données d’un tiers. Sur des données répétitives, gzip regagne cela et plus encore.
| Entrée | Base64 simple | Gzip + Base64 |
|---|---|---|
Hello, world! (13 octets) | 20 caractères | 44 caractères |
| Un tableau JSON de 9 281 octets avec 100 fiches produits | 12 376 caractères | 1 096 caractères |
| Une photo JPEG | environ 4/3 du fichier | un peu plus long que le Base64 simple |
Ces chiffres ont été obtenus avec gzip -6. Le compresseur du navigateur peut différer de quelques octets, et la ligne d’infos affiche les valeurs exactes pour votre entrée. En règle générale, les entrées de moins de 100 octets environ et tout ce qui est déjà compressé gagnent à rester en Base64 simple.
Où l’on trouve des chaînes gzip + Base64
- Cloud-init et user data des VM : cloud-init détecte les user data compressées en gzip, ce qui aide à rester sous les limites de taille des services de métadonnées cloud.
- Les abonnements AWS CloudWatch Logs livrent les lots de logs à Lambda sous forme de Base64 de gzip dans
awslogs.data. - Helm 3 stocke chaque release sous forme de Base64 d’un JSON compressé en gzip, dans un Secret Kubernetes.
- Les variables d’environnement et les champs JSON qui doivent contenir un fichier de configuration ou un gros bloc de texte.
- Les query strings et les liens profonds contenant un objet d’état. Utilisez la sortie URL-safe dans ce cas.
Hormis le préfixe H4sI, rien dans le Base64 n’indique au destinataire que les données sont en gzip. Précisez-le dans le nom du champ ou la documentation de l’API ou, en HTTP, envoyez le corps binaire avec Content-Encoding: gzip plutôt qu’en Base64.
Gzip + Base64 dans le code
import base64, gzip
data = open("products.json", "rb").read()
packed = base64.b64encode(gzip.compress(data, mtime=0)).decode()
// Node.js
const zlib = require("zlib");
const packed = zlib.gzipSync(Buffer.from(text)).toString("base64");
Dans les navigateurs, new CompressionStream("gzip") se charge de la compression ; c’est ce qu’utilise cette page. D’autres exemples figurent sur les pages Python et Node.js.
Problèmes courants
- Le destinataire obtient des données illisibles : il a décodé le Base64 sans décompresser le gzip. Vérifiez la présence de
H4sIet décompressez avec le décodeur Base64 gzip. - « incorrect header check » de l’autre côté : le destinataire attend du zlib, pas du gzip. Passez Format sur zlib (deflate) ; la page zlib explique quelle bibliothèque attend quoi.
- Brotli est grisé : l’API de compression intégrée du navigateur ne propose pas Brotli, et la page l’indique sous les options.
- La sortie diffère de celle d’un autre outil : les en-têtes gzip contiennent un horodatage et un octet de système d’exploitation, et les compresseurs choisissent des niveaux différents. Des octets différents peuvent se décompresser en un même contenu.
FAQ
Compresser en gzip avant Base64 raccourcit-il la chaîne ?
Pour du texte, du JSON, du XML et des logs de plus de quelques centaines d’octets, généralement de beaucoup. Pour les chaînes courtes et les données déjà compressées (JPEG, PNG, ZIP, MP4), le résultat est plus long, car gzip ajoute 18 octets d’en-tête et de fin.
Pourquoi toutes les chaînes gzip en Base64 commencent-elles par H4sI ?
Les données gzip commencent par les octets 1F 8B 08, et ces trois octets donnent H4sI en Base64. Les caractères suivants dépendent des drapeaux et de l’horodatage : H4sIAAAAAAAA signifie sans nom de fichier et sans date de modification.
Comment compresser en gzip et encoder en Base64 dans le terminal ?
Sous Linux : gzip -nc file.json | base64 -w0. Sous macOS, où base64 n’a pas de -w, utilisez gzip -nc file.json | base64 | tr -d '\n'. Le -n omet le nom de fichier et la date : la même entrée donne alors la même sortie.