Cómo codificar y decodificar Ascii85
- Escribe o pega texto en Entrada · Texto. El Ascii85 aparece en Salida · Ascii85 (Adobe).
- Bajo la salida, marca Añadir delimitadores <~ ~> para el formato de PostScript/PDF y desmarca z para grupos de ceros si tu decodificador no admite el atajo.
- Para usar otro alfabeto Base85, cambia A a Base85 (Git / Python b85), Z85 (ZeroMQ) o RFC 1924 (IPv6 Base85).
- Para decodificar, pulsa Ascii85 (Adobe) → Texto en el selector de dirección. El decodificador acepta los delimitadores
<~ ~>,z,yy cualquier espacio en blanco, así que los datos de un archivo con saltos de línea se pegan tal cual. - Si el resultado es binario, pon A en Hex o pulsa Guardar bytes.
Cómo funciona Ascii85
Ascii85 toma 4 bytes cada vez, los lee como un único número de 32 bits big-endian y lo escribe como 5 dígitos en base 85. Cada dígito es un carácter de ! (valor 0) a u (valor 84). Cinco caracteres por cada cuatro bytes suponen un 25% de sobrecarga, frente al 33% de Base64.
El ejemplo clásico es Man (con el espacio final): los bytes 4d 61 6e 20 se convierten en 9jqo^. Cuando el último grupo está incompleto, el codificador lo rellena con bytes cero y escribe solo n + 1 caracteres para n bytes, así que Hello (5 bytes) se convierte en 87cURDZ: cinco caracteres para Hell y dos para o.
Dos atajos acortan patrones frecuentes. z sustituye a un grupo de cuatro bytes cero, que escrito entero es !!!!!. y sustituye a cuatro espacios en la variante btoa. Este decodificador lee los dos, y el codificador escribe z (se puede desactivar) pero nunca y.
Comparativa de variantes de Base85
| Variante | Alfabeto | Hello | Dónde se usa |
|---|---|---|---|
| Ascii85 (Adobe) | ! a u en orden ASCII | 87cURDZ | PostScript, PDF /ASCII85Decode |
| Base85 (Git / Python) | 0-9 A-Z a-z !#$%&()*+-;<=>?@^_`{|}~ | NM&qnZv | Parches binarios de Git, base64.b85encode de Python |
| Z85 | 0-9 a-z A-Z .-:+=^!/*?&<>()[]{}@%$# | nm=QNzV | Claves de ZeroMQ y CurveZMQ, consulta Z85 |
| RFC 1924 | El mismo que Git | 4)+k&C#VzJ4br>0wv%Yp para una dirección IPv6 | Direcciones IPv6, como broma |
Los alfabetos de Git y de RFC 1924 son iguales, pero RFC 1924 trata una dirección entera de 16 bytes como un único número de 128 bits en lugar de cuatro grupos de 4 bytes. El RFC 1924 se publicó el 1 de abril de 1996 y propone escribir 1080::8:800:200c:417a como 4)+k&C#VzJ4br>0wv%Yp. El convertidor lo reproduce con De en Dirección IPv6 y A en RFC 1924 (IPv6 Base85).
Ascii85 en PDF y PostScript
PostScript Level 2 introdujo Ascii85 para incrustar datos binarios, como imágenes y fuentes, en un archivo de texto. Los datos van enmarcados como <~ … ~>. En PDF, un stream con /Filter /ASCII85Decode contiene la misma codificación, terminada en ~>. Este decodificador encuentra la marca final con o sin el <~ de apertura.
Ascii85 suele ser el filtro exterior de una cadena, por ejemplo /Filter [/ASCII85Decode /FlateDecode]. Al decodificar el Ascii85 se obtienen entonces bytes comprimidos con zlib, no contenido legible.
Git usa Base85 de otra manera. En un GIT binary patch, cada línea empieza con un carácter de longitud (A–Z para 1–26 bytes, a–z para 27–52), seguido del Base85 de los datos comprimidos con zlib. Quita ese primer carácter de cada línea antes de decodificar y descomprime después el resultado.
Ascii85 y Base85 en Python
La biblioteca estándar incluye los dos alfabetos:
import base64
base64.a85encode(b"Hello") # b'87cURDZ'
base64.a85encode(b"Hello", adobe=True) # b'<~87cURDZ~>'
base64.a85encode(b" ", foldspaces=True) # b'y'
base64.b85encode(b"Hello") # b'NM&qnZv'
base64.a85decode(b"<~9jqo^~>", adobe=True) # b'Man '
a85decode necesita adobe=True para aceptar los delimitadores. Consulta la página de Python para más recetas de codificación.
Problemas habituales
"z" en la posición … solo se permite entre grupos de 5 caracteres. Hay unazdentro de un grupo. Los datos están dañados o no son Ascii85; Z85 y el Base85 de Git usanzcomo un dígito normal.el grupo que empieza en la posición … está fuera de rango. Cinco caracteres codifican un valor mayor que 2^32 − 1. Ocurre al decodificar Base85 de Git o Z85 como Ascii85; cambia De.- Un carácter inesperado como
v,{o|. Todo lo que va después deu, salvo los atajosyyz, queda fuera del alfabeto Ascii85, otra señal de que se trata de otra variante. - La salida tiene bytes cero de más al final. Tu codificador rellenó el último grupo y escribió los 5 caracteres. Ascii85 escribe n + 1 caracteres para un grupo final de n bytes.
Preguntas frecuentes
¿Qué diferencia hay entre Base85 y Ascii85?
Base85 es la idea general de escribir 4 bytes como 5 caracteres de un conjunto de 85. Ascii85 es la versión de Adobe, con los caracteres de ! a u, el atajo z y los delimitadores <~ ~>. Git, b85encode de Python, Z85 y RFC 1924 usan la misma aritmética con otros alfabetos.
¿Qué significa la z en Ascii85?
Una sola z equivale a cuatro bytes cero, que de otro modo se escribirían !!!!!. Solo se permite donde empezaría un grupo completo de 5 caracteres; una z dentro de un grupo es un error.
¿Cómo decodifico el Ascii85 de un PDF?
Copia los datos del stream entre stream y endstream hasta ~> incluido, y pégalos con la dirección Ascii85 (Adobe) → Texto. Si el stream indica también /FlateDecode, el resultado son datos zlib; pon A en Base64 y descomprímelos con el decodificador gzip y zlib.
¿Es Base85 mejor que Base64?
Es un 6% más corto, aproximadamente: un 25% de sobrecarga frente a un 33%. Pero sus alfabetos incluyen comillas, barras invertidas o < y &, según la variante, así que necesita escapes en JSON, XML o la shell donde Base64 no los necesita. Úsalo donde esos caracteres sean seguros.