Cómo comprimir con gzip y codificar en Base64
- Escribe o pega texto en la entrada, o suelta un archivo. En vivo está activado, así que la salida se actualiza mientras escribes.
- Deja Formato en gzip. zlib, raw deflate y, si el navegador lo admite, Brotli están en la misma lista.
- Marca URL-safe (- _) si la cadena va en una URL o un nombre de archivo, o Ajustar a 76 para longitudes de línea de correo o estilo PEM.
- Copiar salida, Descargar el Base64 como archivo
.txt, o Descargar archivo comprimido para guardar el.gzbinario.
La línea de datos muestra el tamaño de entrada, el tamaño comprimido, el tamaño en Base64 y el ratio, y el estado indica cuánto más corto o más largo es el resultado que el Base64 simple de la misma entrada.
Cuándo compensa comprimir primero
Base64 siempre aumenta los datos en un tercio. Con datos que tienen repeticiones, gzip recupera eso y más.
| Entrada | Base64 simple | Gzip + Base64 |
|---|---|---|
Hello, world! (13 bytes) | 20 caracteres | 44 caracteres |
| Un array JSON de 9.281 bytes con 100 registros de productos | 12.376 caracteres | 1.096 caracteres |
| Una foto JPEG | unos 4/3 del archivo | algo más largo que el Base64 simple |
Las cifras se obtuvieron con gzip -6. El compresor del navegador puede diferir en unos pocos bytes, y la línea de datos muestra los números exactos para tu entrada. Como regla general, las entradas de menos de unos 100 bytes y todo lo que ya está comprimido quedan mejor como Base64 simple.
Dónde se usan las cadenas gzip + Base64
- Cloud-init y user data de máquinas virtuales: cloud-init detecta user data comprimido con gzip, lo que ayuda a no pasarse de los límites de tamaño de los servicios de metadatos en la nube.
- Las suscripciones de AWS CloudWatch Logs entregan lotes de logs a Lambda como Base64 de gzip en
awslogs.data. - Helm 3 guarda cada release como Base64 de JSON comprimido con gzip dentro de un Secret de Kubernetes.
- Variables de entorno y campos JSON que deben contener un archivo de configuración o un bloque de texto grande.
- Query strings y enlaces profundos con un objeto de estado. Usa ahí la salida URL-safe.
Aparte del prefijo H4sI, nada en el Base64 indica al receptor que los datos son gzip. Indícalo en el nombre del campo o en la documentación de la API o, por HTTP, envía el cuerpo binario con Content-Encoding: gzip en lugar de Base64.
Gzip + Base64 en código
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");
En los navegadores, new CompressionStream("gzip") hace la compresión, y es lo que usa esta página. Hay más ejemplos en las páginas de Python y Node.js.
Problemas habituales
- El receptor recibe basura: decodificó el Base64 pero no lo descomprimió. Comprueba si empieza por
H4sIy descomprímelo con el decodificador Base64 gzip. - “incorrect header check” en el otro lado: el receptor espera zlib, no gzip. Cambia Formato a zlib (deflate); la página de zlib explica qué biblioteca espera cada uno.
- Brotli aparece en gris: la API de compresión integrada del navegador no ofrece Brotli, y la página lo indica bajo las opciones.
- La salida difiere de la de otra herramienta: las cabeceras gzip llevan una marca de tiempo y un byte de sistema operativo, y cada compresor elige niveles distintos. Bytes distintos pueden descomprimirse en el mismo contenido.
Preguntas frecuentes
¿Comprimir con gzip antes de Base64 acorta la cadena?
Con texto, JSON, XML y logs de más de unos cientos de bytes, normalmente mucho. Con cadenas cortas y datos ya comprimidos (JPEG, PNG, ZIP, MP4) el resultado sale más largo, porque gzip añade 18 bytes de cabecera y cola.
¿Por qué toda cadena gzip en Base64 empieza por H4sI?
Los datos gzip empiezan por los bytes 1F 8B 08, y esos tres bytes son H4sI en Base64. Los caracteres siguientes dependen de los flags y la marca de tiempo: H4sIAAAAAAAA significa sin nombre de archivo y sin fecha de modificación.
¿Cómo comprimo con gzip y codifico en Base64 desde la terminal?
En Linux: gzip -nc file.json | base64 -w0. En macOS, donde base64 no tiene -w, usa gzip -nc file.json | base64 | tr -d '\n'. La -n omite el nombre del archivo y la fecha, así la misma entrada da la misma salida.