Cómo se usa
- Elige Codificar para convertir texto o bytes en Ascii85, o Decodificar para convertir Ascii85 de nuevo en datos.
- Activa Delimitadores <~ ~> si la salida va a ir en PostScript o debe coincidir con a85encode de Python con adobe=True.
- Si quieres, elige un Ajuste de línea para dividir la salida larga en líneas.
- Escribe, pega o abre un archivo y, después, copia o descarga el resultado. Al decodificar, se ignoran los delimitadores, los espacios y los saltos de línea.
¿Qué es Ascii85?
Ascii85 lee la entrada de 4 en 4 bytes, trata cada grupo como un número de 32 bits y lo escribe como 5 dígitos en base 85. Los dígitos son los 85 caracteres ASCII consecutivos que van de ! (código 33) a u (código 117): cada carácter es simplemente el valor del dígito más 33. La salida ocupa un 25 % más que la entrada, frente al 33 % de Base64.
El formato se usó por primera vez en la utilidad btoa de Unix. Adobe lo adoptó como la codificación ASCII base-85 de PostScript Level 2 y de PDF, donde permite transportar datos binarios, como imágenes y fuentes, dentro de un archivo de texto plano. Python lo ofrece como base64.a85encode() y Go como el paquete encoding/ascii85.
La abreviatura z y los delimitadores de Adobe
Un grupo de cuatro bytes cero se escribiría normalmente como cinco signos de exclamación. En su lugar, Ascii85 lo escribe como una sola z, lo que acorta las series de datos vacíos. La abreviatura solo se aplica a grupos completos. Cuando la longitud de la entrada no es múltiplo de 4, el grupo final de n bytes se convierte en n + 1 caracteres y nunca se abrevia.
PostScript marca una cadena Ascii85 con <~ al principio y ~> al final. En un flujo de PDF con el filtro ASCII85Decode solo se usa el cierre ~>, como marca de fin de datos. Este decodificador elimina cualquiera de los dos delimitadores si están presentes e ignora los espacios en blanco, así que puedes pegar directamente los datos de un flujo de un archivo PDF o PostScript.
Ascii85 en código
# Python 3.4+
import base64
base64.a85encode(b'hello') # b'BOu!rDZ'
base64.a85encode(b'hello', adobe=True) # b'<~BOu!rDZ~>'
base64.a85decode(b'<~BOu!rDZ~>', adobe=True) # b'hello'
// Go
import "encoding/ascii85"
dst := make([]byte, ascii85.MaxEncodedLen(len(src)))
n := ascii85.Encode(dst, src)
Especificación
| Alfabeto | ASCII 33 (!) a 117 (u), más z |
|---|---|
| Tamaño de salida | 5 caracteres por cada 4 bytes (125%) |
| Relleno | Ninguno; delimitadores <~ ~> opcionales |
| Estándar | Adobe PostScript y PDF |
| Distingue mayúsculas y minúsculas | Sí |
Ejemplos
| Entrada (UTF-8) | Salida |
|---|---|
Hello, World! | 87cURD_*#4DfTZ)+T |
Base64.is | 6=FqH2Dd%#Er |
你好 | jLq5JV7c |
Preguntas frecuentes
¿Qué diferencia hay entre Ascii85 y Base85?
¿Por qué mi salida contiene la letra z?
z representa cuatro bytes cero de un grupo completo. Los decodificadores la vuelven a expandir automáticamente, así que los datos no cambian.¿Necesito los delimitadores de Adobe?
Solo si el programa que lee los datos los espera, por ejemplo un intérprete de PostScript o a85decode de Python con adobe=True. Muchas herramientas aceptan Ascii85 sin ellos. Al decodificar aquí, los delimitadores son opcionales.
¿Puedo decodificar un flujo ASCII85 de un PDF?
Sí. Pega los datos del flujo y elige Hexadecimal como Formato de salida, o descarga el resultado. Si en los filtros del flujo aparece FlateDecode después de ASCII85Decode, los bytes decodificados siguen comprimidos con zlib y necesitan un segundo paso.
¿Por qué aparece un error de carácter no válido?
! a u, más z entre grupos. La abreviatura y para cuatro espacios, que usan algunas versiones de btoa y Python con foldspaces=True, no forma parte del formato de Adobe y se rechaza.