Codificador y decodificador Z85

Convierte texto, bytes en hexadecimal o archivos a Z85 y viceversa. Z85 es la variante de Base85 definida por ZeroMQ, con un alfabeto que cabe en los literales de cadena del código fuente sin necesidad de escapes.

Se ejecuta por completo en tu navegador. No se sube nada.

Cómo se usa

  1. Elige Codificar para convertir texto o bytes en Z85, o Decodificar para convertir Z85 de nuevo en datos.
  2. Para claves y otros valores binarios, pon el Formato de entrada en Hexadecimal al codificar, o el Formato de salida en Hexadecimal al decodificar.
  3. Escribe, pega o abre un archivo. El resultado se actualiza mientras escribes.
  4. Copia el resultado o descárgalo como archivo.

¿Qué es Z85?

Z85 se especifica en ZeroMQ RFC 32 (una especificación de la comunidad ZeroMQ, no una RFC del IETF). Como otras codificaciones Base85, convierte cada 4 bytes en 5 caracteres: lee cada grupo como un número de 32 bits big-endian y lo escribe como 5 dígitos en base 85, empezando por el más significativo. La salida ocupa un 25 % más que la entrada.

Lo que distingue a Z85 es su alfabeto: 0-9, a-z, A-Z y los 23 símbolos .-:+=^!/*?&<>()[]{}@%$#. Deja fuera los dos tipos de comillas, la barra invertida, el acento grave, la coma, el punto y coma, la barra vertical, la virgulilla y el guion bajo. El alfabeto se diseñó para ser seguro en cadenas de código fuente, así que un valor Z85 se puede pegar entre comillas en C, Python o JSON sin ningún escape.

Dónde se usa Z85

ZeroMQ usa Z85 para mostrar las claves CurveZMQ. Una clave pública o secreta de 32 bytes se convierte en una cadena Z85 de 40 caracteres, que es la forma que devuelve zmq_curve_keypair() y la que aceptan las opciones de socket de la seguridad CURVE. La biblioteca también ofrece zmq_z85_encode() y zmq_z85_decode(), y bindings como pyzmq proporcionan las mismas funciones.

// C (libzmq)
char text[41];                       // 32 bytes -> 40 caracteres + NUL
zmq_z85_encode(text, key, 32);

# Python (pyzmq)
from zmq.utils import z85
z85.encode(bytes.fromhex('864fd26fb559f75b'))   # b'HelloWorld'

La última línea es el vector de prueba de la especificación.

Longitud de la entrada: una nota sobre esta herramienta

RFC 32 exige que la entrada binaria sea múltiplo de 4 bytes y que la cadena codificada sea múltiplo de 5 caracteres. No define ningún relleno, y las implementaciones estrictas como zmq_z85_encode() rechazan otras longitudes.

Esta herramienta también acepta otras longitudes y aplica la misma regla que Ascii85 y Base85: un grupo final de n bytes se convierte en n + 1 caracteres. Se trata de una extensión no estándar. Otros decodificadores Z85 pueden rechazar la salida generada así, por lo que conviene rellenar los datos hasta un múltiplo de 4 bytes cuando necesites compatibilidad. Las claves CurveZMQ tienen 32 bytes y siempre encajan.

Especificación

Alfabeto0-9 a-z A-Z .-:+=^!/*?&<>()[]{}@%$#
Tamaño de salida5 caracteres por cada 4 bytes (125%)
RellenoNinguno
EstándarZeroMQ RFC 32
Distingue mayúsculas y minúsculasSí

Ejemplos

Entrada (UTF-8)Salida
Hello, World!nm=QNz.92jz/PV8aP
Base64.islsB}Dhz^42A@
你好<H}kFRm=

Preguntas frecuentes

¿Qué diferencia hay entre Z85 y Ascii85?
La aritmética es la misma; los alfabetos, no. Ascii85 usa el rango ASCII de ! a u, que incluye comillas y la barra invertida, y tiene una abreviatura z para los bytes cero. Z85 evita los caracteres que necesitan escape en las cadenas y no tiene abreviaturas.
¿Z85 usa relleno?

No. La especificación solo admite longitudes de entrada que sean múltiplo de 4 bytes. Esta herramienta codifica otras longitudes con un grupo final más corto, algo que no forma parte del estándar.

¿Puedo usar Z85 en JSON, XML o URL?
En cadenas JSON, sí, sin escapes. En XML y HTML hay que escapar <, > y &. Para URL, Z85 no es buena opción porque ?, &, / y # tienen un significado especial; usa Base64URL o Base58 en su lugar.
¿Cuánto mide una clave CurveZMQ codificada en Z85?

Una clave CurveZMQ tiene 32 bytes, así que se codifica en exactamente 40 caracteres. Para ver la clave en bruto, decodifícala aquí con Hexadecimal como Formato de salida.