Cómo comprimir con zlib y codificar en Base64
- Escribe o pega el texto, o suelta un archivo.
- Formato empieza en zlib (deflate). Cambia a Deflate sin procesar cuando el receptor quiera el flujo sin envoltorio, o a gzip.
- Si quieres, marca URL-safe (- _) o Ajustar a 76.
- Copiar salida, o descarga el Base64 como
.txto el archivo binario.zz/.deflate.
Intercambiar envía la salida al lado Descomprimir para confirmar el viaje de ida y vuelta.
El mismo texto en tres envoltorios
Hello, world! (13 bytes), comprimido con el nivel por defecto:
| Formato | Bytes | Base64 |
|---|---|---|
| raw deflate | 15 | 80jNycnXUSjPL8pJUQQA |
| zlib | 21 | eJzzSM3JyddRKM8vyklRBAAgXgSK |
| gzip | 33 | H4sIAAAAAAAAA/NIzcnJ11Eozy/KSVEEAObG5usNAAAA |
El flujo deflate son los mismos 15 bytes en los tres, pero el Base64 se ve distinto porque los encabezados de 2 y 10 bytes desplazan la posición de cada byte dentro de los grupos de 3 bytes. El encabezado de zlib es 78 9C con el nivel por defecto, y por eso el Base64 de zlib empieza por eJ. Con el nivel 9 es 78 DA, en Base64 eN.
Qué llamada produce cada formato
La mayoría de los fallos con «deflate» vienen de que dos partes usan la misma palabra para envoltorios distintos:
| Lenguaje | zlib (RFC 1950) | raw deflate (RFC 1951) | gzip |
|---|---|---|---|
| Python | zlib.compress() | zlib.compressobj(wbits=-15) | gzip.compress() |
| Node.js | zlib.deflateSync() | zlib.deflateRawSync() | zlib.gzipSync() |
| Navegador | 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 |
Ojo con las trampas: DeflateStream de .NET y compress/flate de Go son raw, mientras que el «deflate» de Node y del navegador es zlib. Un servicio en C# y un cliente en Node que «usan deflate» los dos no se entenderán sin un cambio en uno de los lados.
Dónde aparece cada envoltorio
- zlib: flujos
FlateDecodede PDF, datos de imagen PNG, objetos de Git, muchos protocolos binarios y formatos de partidas guardadas de juegos. - raw deflate: el binding HTTP-Redirect de SAML (el decodificador SAML se encarga de él), las entradas dentro de los archivos ZIP,
permessage-deflatede WebSocket. - gzip: archivos, HTTP, logs. La página de gzip lo cubre.
Zlib + Base64 en código
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'
Para volver a leer esas cadenas, usa el decodificador Base64 de gzip y zlib, que detecta los tres envoltorios. Más en Python y Node.js.
Problemas habituales
incorrect header check: decodificador zlib con datos raw o gzip. Haz coincidir el envoltorio.invalid stored block lengthsoinvalid block type: decodificador raw deflate con datos zlib; los dos bytes del encabezado se leen como bloques deflate.- El resultado es más largo que la entrada: las cadenas cortas no se comprimen. Por debajo de unos 50–100 bytes, el Base64 simple es más corto.
- La salida no coincide byte a byte con la de otra herramienta: el nivel de compresión y la biblioteca cambian los bytes, y cualquier descompresor correcto devuelve el mismo original en ambos casos.
Preguntas frecuentes
¿Qué diferencia hay entre zlib y deflate?
Deflate es el algoritmo de compresión. Raw deflate es el flujo comprimido sin más; zlib le añade un encabezado de 2 bytes y una suma de comprobación Adler-32 de 4 bytes alrededor; gzip añade un encabezado de 10 bytes y un final de 8 bytes con CRC-32. Los datos comprimidos del medio son idénticos.
¿Qué provoca el error 'incorrect header check'?
El descompresor esperaba un encabezado zlib y recibió otra cosa, casi siempre raw deflate o gzip. Usa la llamada correspondiente (zlib.decompress(data, -15) en Python para raw deflate) o vuelve a codificar con el formato que espera el receptor.
¿Content-Encoding: deflate de HTTP es raw deflate o zlib?
La especificación HTTP dice zlib. Algunos servidores antiguos enviaban raw deflate con ese nombre, y por eso gzip es la opción más segura para HTTP.