Ascii85 (también conocido como "Base85") es una forma de codificar datos binarios con texto desarrollado por Paul E. Rutter para la biblioteca btoa. Debido a que se utilizan 5 caracteres ASCII para codificar 4 bytes de datos (los datos procesados son ¹⁄₄ más grandes que los originales cuando se utilizan caracteres ASCII de 8 bits), se logra una mayor eficiencia que en el caso de uuencode o Base64 , en el que cada 3 bytes se codifican con 4 caracteres (un aumento de ¹⁄₃ en las mismas condiciones).
Se utiliza principalmente en los formatos PostScript y Portable Document Format de Adobe .
La principal necesidad de codificar datos en texto surge de la necesidad de transferir datos binarios utilizando protocolos existentes diseñados exclusivamente para la transmisión de texto (por ejemplo, correo electrónico). Solo se puede garantizar que dichos protocolos pasen valores de 7 bits (y eviten el uso de caracteres de control ASCII), y pueden requerir la inserción de un carácter de final de línea para limitar la longitud de las líneas y permitir la sangría de espacios en blanco. Esto deja solo 94 caracteres imprimibles que se pueden usar.
4 bytes pueden contener 232 = 4294967296 valores diferentes . 5 dígitos en base 85 dan 855 = 4437053125 valores distintos, lo cual es suficiente para representar valores de 32 bits sin ambigüedades. Cinco dígitos en base 84 solo pueden proporcionar 84 5 = 4,182,119,424 valores. Por lo tanto, 85 es la base mínima del sistema numérico en el que se pueden codificar 4 bytes con cinco dígitos, por lo que se eligió.
Al codificar, dividimos el flujo de datos en grupos de 4 bytes y consideramos cada uno de ellos como un número de 32 bits, con el byte alto al principio . Por división consecutiva por 85 obtenemos 5 dígitos del sistema numérico 85-ario. Además, cada dígito se codifica con un carácter ASCII imprimible y se envía al flujo de salida conservando el orden desde el dígito más significativo hasta el menos significativo.
La codificación de un dígito con caracteres ASCII se realiza aumentando en 33, es decir, caracteres con códigos desde 33 (" !") hasta 117 (" u").
Dado que los valores cero no son tan raros, en aras de la compresión adicional, se hace una excepción adicional: los cero cuatro bytes se codifican con un solo carácter " z" en lugar de " !!!!!".
Un grupo de caracteres que, cuando se decodifica, arroja un valor superior a 2 32 − 1 (codificado como " s8W-!") da como resultado un error de decodificación, al igual que el carácter " z" dentro del grupo. Todas las sangrías de espacios en blanco entre caracteres se ignoran y se pueden insertar arbitrariamente para un formato conveniente.
La única desventaja de Ascii85 es que el texto resultante contendrá caracteres (como barras y comillas) que tienen significados especiales en lenguajes de programación y protocolos de texto.
El programa btoa original siempre se codificaba en grupos completos (este último se rellenaba con ceros) y anteponía el texto resultante con la cadena "xbtoa Begin" seguida de "xbtoa End" seguido del tamaño del archivo fuente (decimal y hexadecimal) y tres 32 sumas de comprobación de bits. El decodificador usó la información de longitud original para averiguar cuántos ceros de relleno se insertaron.
Este programa también admite el valor especial " z" para codificar ceros (0x00000000), así como " y" para un grupo de cuatro espacios (0x20202020).
Adobe adaptó la codificación btoa con algunos cambios y la llamó Ascii85. En particular, se agregó el delimitador " ~>" para indicar el final de la cadena codificada y determinar dónde cortar la cadena decodificada para obtener la longitud correcta. Esto se hace de la siguiente manera: si el último bloque contiene menos de 4 bytes, entonces se complementa con cero bytes antes de la codificación, y después de la codificación, se eliminan tantos caracteres extremos como ceros se agregaron de los últimos cinco.
Durante la decodificación, el último bloque se rellena hasta una longitud de 5 con el símbolo “ u” (código 84), y después de la decodificación, se elimina la misma cantidad de bytes (ver el ejemplo a continuación).
Nota: el carácter de relleno no se eligió al azar. En Base64, al transcodificar, los bits simplemente se reagrupan, no cambia su orden ni sus valores (los bits altos de la secuencia de origen no afectan a los bits bajos del resultado). Cuando se convierte a un sistema numérico con base 85 (85 no es una potencia de dos), los valores de los bits altos de la secuencia original afectan los bits bajos del resultado (de manera similar cuando se vuelve a convertir). La adición de un valor mínimo (0) al codificar y un valor máximo (84) al decodificar asegura que se conserven los bits altos.
En un bloque de texto Ascii85, los espacios y los saltos de línea se pueden insertar en cualquier lugar, incluso dentro de cinco letras. Simplemente deben ser ignorados.
La especificación de Adobe no incluye la extensión " " ypara cuatro espacios.
Por ejemplo, el eslogan histórico de Wikipedia ,
El hombre se distingue, no sólo por su razón, sino por esta singular pasión de otros animales, que es una lujuria de la mente, que por una perseverancia de deleite en la continua e infatigable generación de conocimiento, excede la corta vehemencia de cualquier placer carnal. .estar codificado en Ascii85 se ve así:
<~9jqo^BlbD-BleB1DJ+*+F(f,q/0JhKF<GL>[email protected]$d7F!,L7@<6@)/0JDEF<G%<+EV:2F!, O<DJ+*.@<*K0@<6L(Df-\0Ec5e;DffZ(EZee.Bl.9pF"AGXBPCsi+DGm>@3BB/F*&OCAfu2/AKY i(DIb:@FD,*)+C]U=@3BN#EcYf8ATD3s@q?d$AftVqCh[NqF<G:8+EV:.+Cf>-FD5W8ARlolDIa l(DId<j@<?3r@:F%a+D58'ATD4$Bl@l3De:,-DJs`8ARoFb/0JMK@qB4^F!,R<AKZ&-DfTqBG%G >uD.RTpAKYo'+CT/5+Cei#DII?(E,9)oF*2M7/c~>Texto | METRO | a | norte | ... | s | tu | r | mi | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ASCII | 77 | 97 | 110 | 32 | ... | 115 | 117 | 114 | 101 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
representación binaria | 0 | una | 0 | 0 | una | una | 0 | una | 0 | una | una | 0 | 0 | 0 | 0 | una | 0 | una | una | 0 | una | una | una | 0 | 0 | 0 | una | 0 | 0 | 0 | 0 | 0 | ... | 0 | una | una | una | 0 | 0 | una | una | 0 | una | una | una | 0 | una | 0 | una | 0 | una | una | una | 0 | 0 | una | 0 | 0 | una | una | 0 | 0 | una | 0 | una |
representación decimal | 1 298 230 816 = 24×85 4 + 73×85 3 + 80×85 2 + 78×85 + 61 | ... | 1 937 076 837 = 37×85 4 + 9×85 3 + 17×85 2 + 44×85 + 22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
85 representación (+33) | 24 (57) | 73 (106) | 80 (113) | 78 (111) | 61 (94) | ... | 37 (70) | 9 (42) | 17 (50) | 44 (77) | 22 (55) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
ASCII | 9 | j | q | o | ^ | ... | F | * | 2 | METRO | 7 |
Como el último cuatro no está completo, debemos “rematarlo” con ceros:
Texto | . | \0 | \0 | \0 | ||||||||||||||||||||||||||||
ASCII | 46 | 0 | 0 | 0 | ||||||||||||||||||||||||||||
representación binaria | 0 | 0 | una | 0 | una | una | una | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
representación decimal | 771 751 936 = 14x85 4 + 66x85 3 + 56x85 2 + 74x85 + 46 | |||||||||||||||||||||||||||||||
85 representación (+33) | 14 (47) | 66 (99) | 56 (89) | 74 (107) | 46 (79) | |||||||||||||||||||||||||||
ASCII | / | C | Y | k | O |
Hemos agregado 3 bytes al codificar y debemos eliminar los últimos tres caracteres 'YkO' del resultado.
La decodificación es absolutamente simétrica, a excepción de los últimos cinco, que “rematamos” con caracteres 'u':
ASCII | / | C | tu | tu | tu | |||||||||||||||||||||||||||
85 representación (+33) | 14 (47) | 66 (99) | 84 (117) | 84 (117) | 84 (117) | |||||||||||||||||||||||||||
representación decimal | 771 955 124 = 14×85 4 + 66×85 3 + 84×85 2 + 84×85 + 84 | |||||||||||||||||||||||||||||||
representación binaria | 0 | 0 | una | 0 | una | una | una | 0 | 0 | 0 | 0 | 0 | 0 | 0 | una | una | 0 | 0 | 0 | una | una | 0 | 0 | una | una | 0 | una | una | 0 | una | 0 | 0 |
ASCII | 46 | 3 | 25 | 180 | ||||||||||||||||||||||||||||
Texto | . | [ ETX ] | [EM] | no definido en ASCII |
Como hemos agregado 3 'u', debemos eliminar los últimos 3 bytes del resultado. Como resultado, recibimos un mensaje de la longitud original.
El ejemplo original no tenía un cuarteto de bytes nulos, por lo que no vimos la 'z' abreviada en el resultado.
La codificación Ascii85 es compatible con MIME de 7 y 8 bits , pero tiene menos sobrecarga de espacio que Base64 .
El único problema potencial es que Ascii85 puede contener caracteres que deben escaparse en lenguajes de marcado como XML o SGML , como comillas simples y dobles, corchetes angulares, ampersand (" '"<>&").
Publicado el 1 de abril de 1996, informativo RFC 1924 : "Una representación compacta de direcciones IPv6" propone codificar direcciones IPv6 como números en base 85 (base-85, similar a base-64). Esta propuesta se diferencia de los esquemas anteriores en que, en primer lugar, utiliza un conjunto de otros 85 caracteres ASCII y, en segundo lugar, trata a todo el grupo de 128 bits como un solo número, convirtiéndolo en 20 caracteres finales, y no en grupos. de 32 bits. Además, no se permiten espacios.
Juego de caracteres sugerido, en orden ascendente de códigos: 0- 9, A- Z, a- zy 23 caracteres más !#$%&()*+-;<=>?@^_`{|}~. El mayor valor que cabe en 128 bits de una dirección IPv6 es 2 128 −1 = 74×85 19 + 53×85 18 + 5×85 17 +…, tiene la forma =r54lj&NUUO~Hi%c2ym0.
El conjunto de caracteres se elige para evitar el uso de los caracteres más problemáticos ( "',./:[]\) que deben escaparse en algunos protocolos, como JSON. Pero este conjunto aún contiene caracteres que deben escaparse en los protocolos SGML, como XML.