So komprimieren Sie mit gzip und kodieren in Base64
- Tippen oder fügen Sie Text in die Eingabe ein, oder legen Sie eine Datei ab. Live ist aktiv, die Ausgabe aktualisiert sich also beim Tippen.
- Lassen Sie Format auf gzip. zlib, Raw Deflate und, sofern der Browser es unterstützt, Brotli stehen in derselben Liste.
- Aktivieren Sie URL-sicher (- _), wenn die Zeichenkette in eine URL oder einen Dateinamen kommt, oder Umbruch bei 76 für Zeilenlängen wie in E-Mails und PEM.
- Ausgabe kopieren, das Base64 als
.txt-Datei Herunterladen, oder mit Komprimierte Datei herunterladen die binäre.gzspeichern.
Die Infozeile zeigt Eingabegröße, komprimierte Größe, Base64-Größe und Verhältnis, und die Statusmeldung sagt, um wie viel das Ergebnis kürzer oder länger ist als reines Base64 derselben Eingabe.
Wann sich vorheriges Komprimieren lohnt
Base64 vergrößert Daten immer um ein Drittel. Bei Daten mit Wiederholungen holt gzip das wieder herein und noch mehr.
| Eingabe | Reines Base64 | Gzip + Base64 |
|---|---|---|
Hello, world! (13 Bytes) | 20 Zeichen | 44 Zeichen |
| Ein JSON-Array mit 100 Produktdatensätzen, 9.281 Bytes | 12.376 Zeichen | 1.096 Zeichen |
| Ein JPEG-Foto | etwa 4/3 der Datei | etwas länger als reines Base64 |
Die Werte wurden mit gzip -6 erzeugt. Der Kompressor des Browsers kann um einige Bytes abweichen, und die Infozeile zeigt die genauen Zahlen für Ihre Eingabe. Als Faustregel gilt: Eingaben unter etwa 100 Bytes und alles bereits Komprimierte sind als reines Base64 besser aufgehoben.
Wo gzip + Base64 verwendet wird
- Cloud-init und VM-User-Data: cloud-init erkennt gzip-komprimierte User-Data, was hilft, unter den Größengrenzen der Metadatendienste von Cloud-Anbietern zu bleiben.
- Abonnements für AWS CloudWatch Logs liefern Log-Batches an Lambda als Base64 von gzip in
awslogs.data. - Helm 3 speichert jedes Release als Base64 von gzip-komprimiertem JSON in einem Kubernetes Secret.
- Umgebungsvariablen und JSON-Felder, die eine Konfigurationsdatei oder einen großen Textblock aufnehmen müssen.
- Query-Strings und Deep Links mit einem Zustandsobjekt. Verwenden Sie dort die URL-sichere Ausgabe.
Außer dem Präfix H4sI verrät nichts im Base64 dem Empfänger, dass es sich um gzip handelt. Sagen Sie es im Feldnamen oder in der API-Dokumentation, oder senden Sie über HTTP den binären Body mit Content-Encoding: gzip statt Base64.
Gzip + Base64 im 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");
Im Browser erledigt new CompressionStream("gzip") die Komprimierung, und genau das verwendet diese Seite. Weitere Beispiele stehen auf den Seiten zu Python und Node.js.
Häufige Probleme
- Beim Empfänger kommt Datenmüll an: Er hat das Base64 dekodiert, aber nicht entpackt. Prüfen Sie auf
H4sIund entpacken Sie mit dem Gzip-Base64-Decoder. - „incorrect header check“ auf der Gegenseite: Der Empfänger erwartet zlib, nicht gzip. Stellen Sie Format auf zlib (Deflate); die zlib-Seite erklärt, welche Bibliothek was erwartet.
- Brotli ist ausgegraut: Die integrierte Komprimierungs-API des Browsers bietet kein Brotli an, und die Seite weist unter den Optionen darauf hin.
- Die Ausgabe weicht von einem anderen Tool ab: Gzip-Header enthalten einen Zeitstempel und ein Betriebssystem-Byte, und Kompressoren wählen unterschiedliche Stufen. Unterschiedliche Bytes können zum selben Inhalt entpackt werden.
Häufige Fragen
Wird eine Zeichenkette kürzer, wenn ich vor Base64 mit gzip komprimiere?
Bei Text, JSON, XML und Logs ab einigen hundert Bytes meist deutlich. Bei kurzen Zeichenketten und bereits komprimierten Daten (JPEG, PNG, ZIP, MP4) wird das Ergebnis länger, weil gzip 18 Bytes für Header und Trailer hinzufügt.
Warum beginnt jede gzip-Base64-Zeichenkette mit H4sI?
Gzip-Daten beginnen mit den Bytes 1F 8B 08, und diese drei Bytes ergeben in Base64 H4sI. Die folgenden Zeichen hängen von Flags und Zeitstempel ab: H4sIAAAAAAAA bedeutet kein Dateiname und keine Änderungszeit.
Wie komprimiere ich im Terminal mit gzip und kodiere in Base64?
Unter Linux: gzip -nc file.json | base64 -w0. Unter macOS, wo base64 kein -w kennt: gzip -nc file.json | base64 | tr -d '\n'. Das -n lässt Dateiname und Zeit weg, sodass dieselbe Eingabe dieselbe Ausgabe ergibt.