Ascii85 , también llamado Base85 , es una codificación de binario a texto desarrollada por Paul E. Rutter para la utilidad btoa . Al usar cinco caracteres ASCII para representar cuatro bytes de datos binarios (lo que hace que el tamaño codificado sea 1/4 mayor que el original, suponiendo ocho bits por carácter ASCII), es más eficiente que uuencode o Base64 , que usan cuatro caracteres para representar tres bytes de datos ( un aumento de 1/3 , suponiendo ocho bits por carácter ASCII).
Sus principales usos modernos se encuentran en los formatos de archivo PostScript y Portable Document Format de Adobe , así como en la codificación de parches para archivos binarios utilizada por Git . [ 1 ]
Descripción general
La necesidad básica de una codificación de binario a texto surge de la necesidad de comunicar datos binarios arbitrarios a través de protocolos de comunicación preexistentes diseñados para transmitir únicamente texto legible en inglés . Estos protocolos de comunicación pueden ser seguros solo para 7 bits (y, dentro de ese rango, evitar ciertos códigos de control ASCII), pueden requerir saltos de línea a intervalos máximos determinados y pueden no mantener espacios en blanco . Por lo tanto, solo los 94 caracteres ASCII imprimibles son "seguros" para transmitir datos.
Ochenta y cinco es el valor entero mínimo de n tal que n ≥ 256 ≥ 42 32, por lo que cualquier secuencia de 4 bytes puede codificarse como 5 símbolos, siempre que haya al menos 85 símbolos distintos disponibles. (Cinco dígitos en base -85 pueden representar los números enteros del 0 al 4.437.053.124 inclusive, lo cual es suficiente para representar las 4.294.967.296 posibles secuencias de 4 bytes).
Los caracteres utilizados por el texto codificado son !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuy, además, zpara marcar una secuencia de cuatro bytes cero.
Codificación
Al codificar, cada grupo de 4 bytes se toma como un número binario de 32 bits, con el byte más significativo primero (Ascii85 utiliza la convención big-endian ). Esto se convierte, dividiendo repetidamente por 85 y tomando el resto, en 5 dígitos de base 85. Luego, cada dígito (nuevamente, con el más significativo primero) se codifica como un carácter imprimible ASCII sumándole 33, lo que da como resultado los caracteres ASCII del 33 ( !) al 117 ( u).
Debido a que los datos de ceros son bastante comunes, se hace una excepción en aras de la compresión de datos , y un grupo de ceros se codifica como un solo carácter zen lugar de !!!!!.
Los grupos de caracteres que se decodifican a un valor mayor que 2³² − 1 (codificado como s8W-!) provocarán un error de decodificación, al igual que zlos caracteres en medio de un grupo. Los espacios en blanco entre los caracteres se ignoran y pueden aparecer en cualquier lugar para adaptarse a las limitaciones de longitud de línea.
Limitaciones
La especificación original solo permite codificar una secuencia que sea múltiplo de 4 bytes.
Los datos codificados pueden contener caracteres que tienen un significado especial en muchos lenguajes de programación y en algunos protocolos basados en texto, como el corchete angular izquierdo <, la barra invertida \y las comillas simples y dobles '& ". Otras codificaciones en base 85, como Z85 y RFC 1924, están diseñadas para ser seguras en el código fuente. [ 2 ]
Historia
versión btoa
El programa btoa original siempre codificaba grupos completos (rellenando la fuente según fuera necesario), con una línea de prefijo de "xbtoa Begin" y una línea de sufijo de "xbtoa End", seguida de la longitud del archivo original (en decimal y hexadecimal ) y tres sumas de verificación de 32 bits . El decodificador necesita usar la longitud del archivo para ver cuánto del grupo se rellenó. La propuesta inicial para la codificación btoa usaba un alfabeto de codificación que comenzaba en el carácter de espacio ASCII hasta "t" inclusive, pero esto fue reemplazado por un alfabeto de codificación de "!" a "u" para evitar "problemas con algunos programas de correo (eliminando los espacios en blanco finales)". [ 3 ] Este programa también introdujo la zforma corta especial " " para un grupo de todos los ceros. La versión 4.2 agregó una excepción " " para un grupo de todos los caracteres de espacioy ASCII (0x20202020).
Versión ZMODEM
La codificación "ZMODEM Pack-7" codifica grupos de 4 octetos en grupos de 5 caracteres ASCII imprimibles de forma similar, o posiblemente idéntica, a como lo hace Ascii85. Cuando un programa ZMODEM envía archivos de datos de 8 bits precomprimidos a través de canales de datos de 7 bits , utiliza la codificación "ZMODEM Pack-7". [ 4 ]
Versión de Adobe
Adobe adoptó la codificación básica btoa, pero con ligeros cambios, y la denominó Ascii85. Los caracteres utilizados son los caracteres ASCII del 33 ( !) al 117 ( u) inclusive (para representar los dígitos base-85 del 0 al 84), junto con la letra z(como caso especial para representar un valor 0 de 32 bits ), y se ignora el espacio en blanco. Adobe utiliza el delimitador " ~>" para marcar el final de una cadena codificada en Ascii85, y la cadena puede ir precedida de " <~". [ 5 ] Adobe representa la longitud truncando el último grupo: si el último bloque de bytes de origen contiene menos de 4 bytes, el bloque se rellena con hasta 3 bytes nulos antes de la codificación. Después de la codificación, se eliminan del final de la salida tantos bytes como se añadieron como relleno.
Se aplica el proceso inverso al decodificar: el último bloque se rellena con 5 bytes con el carácter Ascii85 u, y se omiten del final de la salida tantos bytes como se agregaron como relleno (ver ejemplo).
El relleno no es arbitrario. La conversión de binario a base 64 solo reagrupa los bits y no los modifica ni cambia su orden (un bit alto en binario no afecta a los bits bajos en la representación base64). Al convertir un número binario a base 85 (85 no es una potencia de dos), los bits altos sí afectan a los dígitos de orden inferior en base 85 y viceversa. El relleno bajo del binario (con bits cero) durante la codificación y el relleno alto del valor base 85 (con us) durante la decodificación garantizan que los bits de orden superior se conserven (el relleno de ceros en binario proporciona suficiente espacio para que una pequeña suma quede atrapada y no haya acarreo a los bits altos).
En los bloques codificados en Ascii85, los espacios en blanco y los caracteres de salto de línea pueden aparecer en cualquier parte, incluso en medio de un bloque de 5 caracteres, pero deben ignorarse silenciosamente.
La especificación de Adobe no admite la excepción de btoay .
Ejemplo para Ascii85
Toma esta cita del Leviatán de Thomas Hobbes :
Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.
Suponiendo que la cita de 269 caracteres se proporciona en US-ASCII o una codificación 100% compatible para empezar, se puede volver a codificar en Ascii85 como los siguientes 337 caracteres (el recuento y la salida se muestran sin los prefijos/posfijos " " <~y " ~>"): [ a ]
9jqo^BlbD-BleB1DJ+*+F(f,q/0JhKF<GL>Cj@.4Gp$d7F!,L7@<6@)/0JDEF<G%<+EV:2F!,O< DJ+*.@<*K0@<6L(Df-\0Ec5e;DffZ(EZee.Bl.9pF"AGXBPCsi+DGm>@3BB/F*&OCAfu2/AKYi( DIb:@FD,*)+C]U=@3BN#EcYf8ATD3s@q?d$AftVqCh[NqF<G:8+EV:.+Cf>-FD5W8ARlolDIal( DId<j@<?3r@:F%a+D58'ATD4$Bl@l3De:,-DJs`8ARoFb/0JMK@qB4^F!,R<AKZ&-DfTqBG%G>u D.RTpAKYo'+CT/5+Cei#DII?(E,9)oF*2M7/c
Para un análisis detallado de la recodificación, este es el comienzo de la cita de Hobbes:
...y lo siguiente es el final de la cita (penúltima cuádrupla):
Sin embargo, como la última cuádrupla está incompleta después del punto, debe rellenarse con tres bytes cero:
Dado que fue necesario agregar tres bytes de relleno, los tres caracteres finales 'YkO' se omiten en la salida.
La decodificación se realiza de forma inversa, excepto que la última tupla de 5 elementos se rellena con caracteres 'u':
Dado que la entrada tuvo que rellenarse con tres bytes 'u', los últimos tres bytes de la salida se ignoran y terminamos con el punto original.
La frase de entrada no contiene 4 bytes cero consecutivos, por lo que el ejemplo no muestra el uso de la abreviatura 'z'.
Compatibilidad
La codificación Ascii85 es compatible con MIME de 7 y 8 bits , a la vez que tiene una sobrecarga menor que Base64 .
Un posible problema de compatibilidad de Ascii85 es que algunos de los caracteres que utiliza son significativos en lenguajes de marcado como XML o SGML . Para incluir datos Ascii85 en estos documentos, puede ser necesario escapar las comillas , los corchetes angulares y las ampersands .
Versión RFC 1924
El RFC 1924 , publicado el 1 de abril de 1996 , titulado "Una representación compacta de direcciones IPv6" por Robert Elz, propone una codificación en base 85 de las direcciones IPv6 como broma del Día de los Inocentes . Esta difiere del esquema anterior, ya que propone un conjunto diferente de 85 caracteres ASCII y realiza todas las operaciones aritméticas sobre el número de 128 bits, convirtiéndolo en un único número de 20 dígitos en base 85 (sin espacios en blanco internos), en lugar de dividirlo en cuatro grupos de 32 bits.
El conjunto de caracteres propuesto es, en orden, 0– 9, A– Z, a– z, y luego los 23 caracteres . La dirección representable más alta posible, 2 128 −1 = 74×85 19 + 53×85 18 + 5×85 17 + ..., se codificaría como .!#$%&()*+-;<=>?@^_`{|}~ =r54lj&NUUO~Hi%c2ym0
Este conjunto de caracteres excluye los caracteres , lo que lo hace adecuado para su uso en cadenas JSON (donde y requerirían escape). Sin embargo, para protocolos basados en SGML, en particular XML, aún pueden ser necesarios escapes de cadena (para acomodar , y )."',./:[\] "\<>&
Véase también
- Base32 : codificación para una secuencia de valores de bytes utilizando 32 caracteres imprimibles.
- Base36 : codificación para una secuencia de valores de bytes utilizando 36 caracteres imprimibles.
- Base64 : codificación para una secuencia de valores de bytes utilizando 64 caracteres imprimibles.
- Codificación estándar PostScript : conjuntos de caracteres utilizados por PostScript de Adobe Systems.
Notas
- ↑ Esta salida también está limitada a líneas de 75 caracteres por razones técnicas/de formato. Al seleccionarla y copiarla, se incluirán saltos de línea, lo que aumentará el número de caracteres; sin embargo, el decodificador Ascii85 ignora los saltos de línea.
Referencias
- ↑ Hamano, Junio C (5 de mayo de 2006). " [ PATCH ] parche binario" . git . Archivado del original el 26 de julio de 2020.
- ↑ "32/Z85" en el RFC de ZeroMQ
- ↑ Orost, Joe (26 de marzo de 1991). "Re: COMPRESIÓN de datos binarios en ASCII para correo electrónico Re: Codificación de datos binarios en ASCII para correo electrónico" . Grupos de Google . Recuperado el 11 de abril de 2015 .
- ↑ Chuck Forsberg. "Desarrollos recientes en ZMODEM" . omen.com . Archivado del original el 24 de septiembre de 2015. Consultado el 14 de mayo de 2013 ."ZMODEM Pack-7 empaqueta 4 bytes en 5 caracteres de impresión."
- ↑ https://github.com/lindig/ascii85/blob/master/ascii85enc.pod
Enlaces externos
- baseE91
- Referencia del lenguaje PostScript (Adobe): consulte el filtro ASCII85Encode.
- Formatos de codificación de binario a texto
- Sistemas de numeración posicional