Codificación de binario a texto

Conversión de datos informáticos en texto

Una codificación de binario a texto es una codificación de datos en texto simple . Más precisamente, es una codificación de datos binarios en una secuencia de caracteres imprimibles . Estas codificaciones son necesarias para la transmisión de datos cuando el canal de comunicación no permite datos binarios (como correo electrónico o NNTP ) o no es de 8 bits limpio . La documentación de PGP ( RFC  4880) utiliza el término " armadura ASCII " para la codificación de binario a texto cuando se hace referencia a Base64 .

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 que fueron diseñados para transmitir únicamente texto legible por humanos en idioma inglés . Esos protocolos de comunicación pueden ser seguros sólo en 7 bits (y, dentro de ese límite, evitar ciertos códigos de control ASCII), y pueden requerir saltos de línea en ciertos intervalos máximos, y pueden no mantener espacios en blanco . Por lo tanto, sólo los 94 caracteres ASCII imprimibles son "seguros" para utilizarlos para transmitir datos.

Descripción

El estándar de codificación de texto ASCII utiliza 7 bits para codificar caracteres. Con esto es posible codificar 128 (es decir, 2 7 ) valores únicos (0–127) para representar los caracteres alfabéticos, numéricos y de puntuación que se usan comúnmente en inglés , además de una selección de caracteres de control que no representan caracteres imprimibles. Por ejemplo, la letra mayúscula A se representa en 7 bits como 100 0001 2 , 0x41 (101 8 ) , el numeral 2 es 011 0010 2 0x32 (62 8 ), el carácter } es 111 1101 2 0x7D (175 8 ), y el carácter de control RETURN es 000 1101 2 0x0D (15 8 ).

En cambio, la mayoría de los ordenadores almacenan los datos en la memoria organizados en bytes de ocho bits . Los archivos que contienen código ejecutable por máquina y datos no textuales suelen contener los 256 valores posibles de bytes de ocho bits. Muchos programas informáticos empezaron a depender de esta distinción entre texto de siete bits y datos binarios de ocho bits , y no funcionaban correctamente si aparecían caracteres no ASCII en datos que se esperaba que incluyeran solo texto ASCII. Por ejemplo, si no se conserva el valor del octavo bit, el programa podría interpretar un valor de byte superior a 127 como una señal que le indica que debe realizar alguna función.

Sin embargo, a menudo es deseable poder enviar datos no textuales a través de sistemas basados ​​en texto, como cuando se adjunta un archivo de imagen a un mensaje de correo electrónico. Para lograr esto, los datos se codifican de alguna manera, de modo que los datos de ocho bits se codifican en caracteres ASCII de siete bits (generalmente utilizando solo caracteres alfanuméricos y de puntuación, los caracteres imprimibles ASCII). Una vez que llegan sanos y salvos a su destino, se decodifican nuevamente a su formato de ocho bits. Este proceso se conoce como codificación de binario a texto. Muchos programas realizan esta conversión para permitir el transporte de datos, como PGP y GNU Privacy Guard .

Codificación de texto sin formato

Los métodos de codificación de binario a texto también se utilizan como mecanismo para codificar texto simple . Por ejemplo:

  • Algunos sistemas tienen un conjunto de caracteres más limitado que pueden manejar; no sólo no son limpios a nivel de 8 bits , sino que algunos ni siquiera pueden manejar todos los caracteres ASCII imprimibles.
  • Otros sistemas tienen límites en la cantidad de caracteres que pueden aparecer entre saltos de línea, como el límite de "1000 caracteres por línea" de algunos programas de Protocolo simple de transferencia de correo , según lo permite el RFC  2821.
  • Otros añaden encabezados o trailers al texto.
  • Algunos protocolos poco valorados pero que aún se utilizan utilizan señalización en banda , lo que provoca confusión si aparecen patrones específicos en el mensaje. El más conocido es la cadena "From" (incluido el espacio final) al principio de una línea, que se utiliza para separar los mensajes de correo en el formato de archivo mbox .

Al utilizar una codificación de binario a texto en mensajes que ya son texto simple y luego decodificarlos en el otro extremo, se puede lograr que dichos sistemas parezcan completamente transparentes . A esto a veces se lo denomina "blindaje ASCII". Por ejemplo, el componente ViewState de ASP.NET utiliza codificación base64 para transmitir texto de forma segura a través de HTTP POST, con el fin de evitar colisiones de delimitadores .

Estándares de codificación

La siguiente tabla compara las formas más utilizadas de codificación de binario a texto. La eficiencia que se indica es la relación entre la cantidad de bits en la entrada y la cantidad de bits en la salida codificada.

CodificaciónTipo de datosEficienciaImplementaciones de lenguajes de programaciónComentarios
Ascii85Arbitrario80%awk Archivado el 29 de diciembre de 2014 en Wayback Machine , C, C (2), C#, F#, Go, Java Perl, Python, Python (2)Existen varias variantes de esta codificación, Base85 , btoa , etc.
Base32Arbitrario62,5%ANSI C, Delphi, Go, Java, C#, F#, Python 
Base36Entero~64%bash, C , C++ , C# , Java , Perl , PHP , Python , Visual Basic, Swift y muchos otrosUtiliza los números arábigos del 0 al 9 y las letras latinas de la A a la Z (el alfabeto latino básico de la ISO ). Los sistemas de redirección de URL, como TinyURL o SnipURL/Snipr, suelen utilizarlos como identificadores alfanuméricos compactos.
Base45Arbitrario~67% (97% [a] )¡Vamos, Python!Definido en la especificación IETF RFC 9285 para incluir datos binarios de forma compacta en un código QR . [1]
Base56EnteroPHP, Python, GoUna variante de la codificación Base58 que elimina aún más los caracteres "1" y "o" minúscula para minimizar el riesgo de fraude y error humano. [2]
Base58Entero~73%C, C++, Python, C#, JavaSimilar a Base64, pero modificado para evitar caracteres no alfanuméricos (+ y /) y letras que podrían parecer ambiguas cuando se imprimen (0 – cero, I – i mayúscula, O – o mayúscula y l – L minúscula). Base58 se utiliza para representar direcciones de bitcoin . [ cita requerida ] Algunos sistemas de mensajería y redes sociales dividen líneas en cadenas no alfanuméricas. Esto se evita al no utilizar caracteres reservados para URI como +. Para SegWit , fue reemplazado por Bech32, vea a continuación.
Base58 en el código fuente original de Bitcoin
Base62Arbitrario~74%Óxido, pitónSimilar a Base64, pero contiene sólo caracteres alfanuméricos.
Base64Arbitrario75%awk Archivado el 29 de diciembre de 2014 en Wayback Machine , C, C (2), Delphi, Go, Python, muchos otrosUna codificación temprana y aún popular, especificada por primera vez como parte del RFC  989 en 1987
Base85Arbitrario80%C, Python, Python (2)Versión revisada de Ascii85 .
Base91 [3]Arbitrario81%Do# Fa#Variante de ancho constante
base91 [4]Arbitrario81%C, Java, PHP, ensamblaje 8086, AWK C#, F#, RustVariante de ancho variable
Base94 [5]Arbitrario82%Python, C, óxido 
Base122 [6]Arbitrario87,5%JavaScript, Python, Java, Base125 Python y Javascript, Go, C 
BaseXML [7]Arbitrario83,5%C Python JavaScript 
Playa32Arbitrario62,5 % + al menos 8 caracteres (etiqueta, separador, ECC de 6 caracteres )C, C++, JavaScript , Go , Python, Haskell , Ruby y RustEspecificación. [8] Se utiliza en Bitcoin y en la red Lightning . [9] La parte de datos está codificada como Base32 con la posibilidad de comprobar y corregir hasta 6 caracteres mal escritos utilizando el código BCH de 6 caracteres al final, que también comprueba/corrige la parte legible por humanos. La variante Bech32m tiene un cambio sutil que la hace más resistente a los cambios de longitud. [10]
BinHexArbitrario75%Perl, C, C (2)MacOS clásico
DecimalEntero~42%La mayoría de los idiomasGeneralmente es la representación predeterminada para entrada/salida desde/hacia humanos.
Hexadecimal (Base 16)Arbitrario50%La mayoría de los idiomasExiste en variantes en mayúsculas y minúsculas .
Intel HEXArbitrario≲50%Biblioteca C, C++Generalmente se utiliza para programar chips de memoria flash EPROM y NOR.
MÍMICAArbitrarioVer Quoted-printable y Base64Ver Quoted-printable y Base64Contenedor de codificación para formato similar al del correo electrónico
Codificación porcentualTexto ( URI ), arbitrario (RFC1738)~40% [b] (33–70% [c] )C, Python y probablemente muchos otros 
Citado-imprimibleTexto~33–100% [d]Probablemente muchosConserva los saltos de línea; corta líneas a los 76 caracteres
Registro S (Motorola hexadecimal)Arbitrario49,6%Biblioteca C, C++Generalmente se utiliza para programar chips de memoria flash EPROM y NOR . El 49,6 % supone 255 bytes binarios por registro.
Hexágono TektronixArbitrarioGeneralmente se utiliza para programar chips de memoria flash EPROM y NOR .
Esclerosis múltiple transmisibleHexadecimal~32%Node.js (y CLI)Se utiliza para transmitir transacciones de Blockchain a través de SMS utilizando UTF-16BE .
Codificación UuenArbitrario~60% ( hasta 70% )Perl , C, Delphi, Java, Python y probablemente muchos otros.Una codificación temprana desarrollada en 1980 para la copia de Unix a Unix . Reemplazada en gran medida por MIME y yEnc
Codificación XxArbitrario~75% (similar a Uuencoding)C, DelfosPropuesto (y usado ocasionalmente) como reemplazo de Uuencoding para evitar problemas de traducción de conjuntos de caracteres entre ASCII y los sistemas EBCDIC que podrían dañar los datos Uuencoded.
z85 (especificación ZeroMQ: 32/Z85)Binario y ASCII80% (similar a Ascii85/Base85)C (original), C#, Dart, Erlang, Go, Lua, Ruby, Rust y otrosEspecifica un subconjunto de ASCII similar a Ascii85 , omitiendo algunos caracteres que pueden causar errores en el programa ( ` \ " ' _ , ;). El formato cumple con la especificación ZeroMQ:32/Z85.
RFC  1751 ( S/CLAVE )Arbitrario33%C, [11] Python

"Una convención para claves de 128 bits legibles por humanos ". Una serie de pequeñas palabras en inglés es más fácil de leer, recordar y escribir para los humanos que los sistemas de codificación decimal u otros sistemas de codificación de binario a texto. [12] Cada número de 64 bits se asigna a seis palabras cortas, de uno a cuatro caracteres cada una, de un diccionario público de 2048 palabras. [11]

Los 95 códigos isprint del 32 al 126 se conocen como caracteres imprimibles ASCII .

Algunos formatos más antiguos y hoy en día poco comunes incluyen la codificación BOO, BTOA y USR.

La mayoría de estas codificaciones generan texto que contiene solo un subconjunto de todos los caracteres ASCII imprimibles: por ejemplo, la codificación base64 genera texto que solo contiene letras mayúsculas y minúsculas (A–Z, a–z), números (0–9) y los símbolos "+", "/" y "=".

Algunas de estas codificaciones (codificación imprimible entre comillas y codificación porcentual) se basan en un conjunto de caracteres permitidos y un único carácter de escape . Los caracteres permitidos no se modifican, mientras que todos los demás caracteres se convierten en una cadena que comienza con el carácter de escape. Este tipo de conversión permite que el texto resultante sea casi legible, ya que las letras y los dígitos son parte de los caracteres permitidos y, por lo tanto, se dejan como están en el texto codificado. Estas codificaciones producen la salida ASCII simple más corta para la entrada que es principalmente ASCII imprimible.

Algunas otras codificaciones ( base64 , uuencoding ) se basan en la asignación de todas las secuencias posibles de seis bits a diferentes caracteres imprimibles. Dado que hay más de 2 6  = 64 caracteres imprimibles, esto es posible. Una secuencia dada de bytes se traduce viéndola como un flujo de bits, dividiendo este flujo en fragmentos de seis bits y generando la secuencia de caracteres correspondiente. Las diferentes codificaciones difieren en la asignación entre secuencias de bits y caracteres y en cómo se formatea el texto resultante.

Algunas codificaciones (la versión original de BinHex y la codificación recomendada para CipherSaber ) utilizan cuatro bits en lugar de seis, lo que hace que todas las secuencias posibles de 4 bits se asignen a los 16 dígitos hexadecimales estándar . El uso de 4 bits por carácter codificado genera una salida un 50 % más larga que la de base64, pero simplifica la codificación y la decodificación: expandir cada byte de la fuente de forma independiente a dos bytes codificados es más simple que expandir 3 bytes de la fuente a 4 bytes codificados en base64.

De los primeros 192 códigos de PETSCII , 164 tienen representaciones visibles cuando se citan: 5 (blanco), 17–20 y 28–31 (colores y controles del cursor), 32–90 (equivalente ascii), 91–127 (gráficos), 129 (naranja), 133–140 (teclas de función), 144–159 (colores y controles del cursor) y 160–192 (gráficos). [13] Esto teóricamente permite codificaciones, como base128, entre máquinas que hablan PETSCII.

Véase también

Notas

  1. ^ La codificación para la generación de códigos QR selecciona automáticamente la codificación que coincide con el conjunto de caracteres de entrada, codificando 2 caracteres alfanuméricos en 11 bits, y Base45 codifica 16 bits en 3 de esos caracteres. La eficiencia es, por tanto, de 32 bits de datos binarios codificados en 33 bits: 97%.
  2. ^ Para datos arbitrarios; codificar los 189 caracteres no reservados con tres bytes y los 66 caracteres restantes con uno.
  3. ^ Para texto; codificando únicamente cada uno de los 18 caracteres reservados.
  4. ^ Un byte almacenado como =XX. Codifica todos los caracteres excepto los 94 que no lo necesitan (incluidos el espacio y la tabulación).

Referencias

  1. ^ Fältström, Patrik; Ljunggren, Freik; Gulik, Dirk-Willem van (11 de agosto de 2022). "La codificación de datos Base45". Incluso en modo Byte, un lector de códigos QR típico intenta interpretar una secuencia de bytes como texto codificado en UTF-8 o ISO/IEC 8859-1. ... Dichos datos deben convertirse en un texto apropiado antes de que ese texto pueda codificarse como un código QR. ... Base45 ... ofrece una codificación de código QR más compacta.
  2. ^ Duggan, Ross (18 de agosto de 2009). "Codificación de enteros en base 56 en PHP".
  3. ^ Dake él; Yu Sun; Zhen Jia; Xiuying Yu; Wei Guo; Wei él; Chao Qi; Xianhui Lu. "Una propuesta de sustituto de Base85/64 - Base91" (PDF) . Instituto Internacional de Informática y Sistémica .
  4. ^ "codificación de texto binario a ASCII". basE91 . SourceForge . Consultado el 20 de marzo de 2023 .
  5. ^ "Convertir datos binarios a texto con el menor consumo de recursos". Notas de Vorakl . 18 de abril de 2020.
  6. ^ Albertson, Kevin (26 de noviembre de 2016). "Codificación Base-122".
  7. ^ "BaseXML - para XML1.0+". GitHub . 16 de marzo de 2019.
  8. ^ "bitcoin/bips". GitHub . 8 de diciembre de 2021.
  9. ^ Rusty Russell ; et al. (15 de octubre de 2020). "Codificación de pagos en el repositorio Lightning RFC". GitHub .
  10. ^ "Formato Bech32m para direcciones de testigos v1+". GitHub . 5 de diciembre de 2021.
  11. ^ ab RFC  1760 "El sistema de contraseña de un solo uso S/KEY".
  12. ^ RFC  1751 "Una convención para claves de 128 bits legibles por humanos"
  13. ^ "Códigos PETSCII de Commodore 64". sta.c64.org .
Obtenido de "https://es.wikipedia.org/w/index.php?title=Codificación_de_binario-a-texto&oldid=1252117013"