Wikipedia dice
Los esquemas de codificación Base64 se usan comúnmente cuando existe la necesidad de codificar datos binarios que deben almacenarse y transferirse a través de medios diseñados para manejar datos textuales. Esto es para garantizar que los datos permanezcan intactos sin modificaciones durante el transporte.
Pero, ¿no es que los datos siempre se almacenan / transmiten en binario porque la memoria que tienen nuestras máquinas almacena binarios y solo depende de cómo lo interpretes? Entonces, ya sea que codifique el patrón de bits 010011010110000101101110
como Man
en ASCII o como TWFu
en Base64, eventualmente almacenará el mismo patrón de bits.
Si la codificación final es en términos de ceros y unos y cada máquina y medio puede manejarlos, ¿qué importancia tiene si los datos se representan como ASCII o Base64?
¿Qué significa "medios diseñados para tratar datos textuales"? Pueden lidiar con binary => pueden lidiar con cualquier cosa.
Gracias a todos, creo que entiendo ahora.
Cuando enviamos datos, no podemos estar seguros de que los datos se interpreten en el mismo formato que pretendíamos. Entonces, enviamos datos codificados en algún formato (como Base64) que ambas partes entienden. De esa manera, incluso si el emisor y el receptor interpretan las mismas cosas de manera diferente, pero debido a que están de acuerdo con el formato codificado, los datos no se interpretarán incorrectamente.
Si quiero enviar
Hello
world!
Una forma es enviarlo en ASCII como
72 101 108 108 111 10 119 111 114 108 100 33
Pero el byte 10 podría no interpretarse correctamente como una nueva línea en el otro extremo. Entonces, usamos un subconjunto de ASCII para codificarlo así
83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61
que a costa de transferir más datos por la misma cantidad de información, asegura que el receptor puede decodificar los datos de la manera prevista, incluso si el receptor tiene diferentes interpretaciones para el resto del conjunto de caracteres.
Respuestas:
Su primer error es pensar que la codificación ASCII y la codificación Base64 son intercambiables. Ellos no son. Se usan para diferentes propósitos.
Para entender por qué Base64 era necesario en primer lugar, necesitamos un poco de historia de la informática.
Las computadoras se comunican en binario, 0s y 1s, pero las personas generalmente quieren comunicarse con datos de formas más ricas, como texto o imágenes. Para transferir estos datos entre computadoras, primero debe codificarse en 0s y 1s, enviarse y luego descodificarse nuevamente. Para tomar el texto como ejemplo, hay muchas formas diferentes de realizar esta codificación. Sería mucho más simple si todos pudiéramos estar de acuerdo en una sola codificación, pero lamentablemente este no es el caso.
Originalmente, se crearon muchas codificaciones diferentes (por ejemplo, código Baudot ) que usaban un número diferente de bits por carácter hasta que finalmente ASCII se convirtió en un estándar con 7 bits por carácter. Sin embargo, la mayoría de las computadoras almacenan datos binarios en bytes que consisten en 8 bits cada uno, por lo que ASCII no es adecuado para transferir este tipo de datos. Algunos sistemas incluso borrarían el bit más significativo. Además, la diferencia en las codificaciones de final de línea entre sistemas significa que los caracteres ASCII 10 y 13 también se modificaron a veces.
Para resolver estos problemas, se introdujo la codificación Base64 . Esto le permite codificar bytes de aribtrary en bytes que se sabe que son seguros de enviar sin corromperse (caracteres alfanuméricos ASCII y un par de símbolos). La desventaja es que codificar el mensaje usando Base64 aumenta su longitud: cada 3 bytes de datos se codifican en 4 caracteres ASCII.
Para enviar mensajes de texto de forma fiable que pueda primera codificación de bytes utilizando una codificación de texto de su elección (por ejemplo, UTF-8) y luego después Base64 codificar los datos binarios resultantes en una cadena de texto que es seguro enviar codificado como ASCII. El receptor tendrá que revertir este proceso para recuperar el mensaje original. Por supuesto, esto requiere que el receptor sepa qué codificaciones se usaron, y esta información a menudo debe enviarse por separado.
Históricamente se ha utilizado para codificar datos binarios en mensajes de correo electrónico en los que el servidor de correo electrónico puede modificar los finales de línea. Un ejemplo más moderno es el uso de la codificación Base64 para incrustar datos de imagen directamente en el código fuente HTML . Aquí es necesario codificar los datos para evitar que caracteres como '<' y '>' se interpreten como etiquetas.
Aquí hay un ejemplo de trabajo:
Deseo enviar un mensaje de texto con dos líneas:
Si lo envío como ASCII (o UTF-8) se verá así:
El byte 10 está dañado en algunos sistemas, por lo que podemos codificar en base 64 estos bytes como una cadena Base64:
Que cuando se codifica usando ASCII se ve así:
Todos los bytes aquí son bytes seguros conocidos, por lo que hay muy pocas posibilidades de que algún sistema corrompa este mensaje. Puedo enviar esto en lugar de mi mensaje original y dejar que el receptor invierta el proceso para recuperar el mensaje original.
fuente
Codificación de datos binarios en XML
Suponga que desea incrustar un par de imágenes en un documento XML. Las imágenes son datos binarios, mientras que el documento XML es texto. Pero XML no puede manejar datos binarios incrustados. Entonces, ¿cómo lo haces?
Una opción es codificar las imágenes en base64, convirtiendo los datos binarios en texto que XML pueda manejar.
En vez de:
tú lo haces:
Y el analizador XML podrá analizar el documento XML correctamente y extraer los datos de la imagen.
fuente
.mht
formato antiguo de Microsoft (archivo html + imágenes en un solo archivo).¿Por qué no mirar el RFC que actualmente define Base64 ?
Base64 se diseñó originalmente como una forma de permitir que los datos binarios se adjunten a correos electrónicos como parte de las Extensiones multipropósito de correo de Internet.
fuente
Los medios diseñados para datos textuales son, por supuesto, también binarios, pero los medios textuales a menudo usan ciertos valores binarios para los caracteres de control. Además, los medios textuales pueden rechazar ciertos valores binarios como no textuales.
La codificación Base64 codifica los datos binarios como valores que solo pueden interpretarse como texto en medios textuales, y está libre de caracteres especiales y / o caracteres de control, de modo que los datos también se conservarán en medios textuales.
fuente
Es más que los medios validan la codificación de la cadena, por lo que queremos asegurarnos de que los datos sean aceptables por una aplicación de manejo (y no contengan una secuencia binaria que represente EOL, por ejemplo)
Imagine que desea enviar datos binarios en un correo electrónico con codificación UTF-8: es posible que el correo electrónico no se muestre correctamente si la secuencia de unos y ceros crea una secuencia que no es válida Unicode en la codificación UTF-8.
El mismo tipo de cosas sucede en las URL cuando queremos codificar caracteres no válidos para una URL en la propia URL:
Esto se debe a que queremos enviar un espacio sobre un sistema que pensará que el espacio es maloliente.
Todo lo que estamos haciendo es asegurarnos de que haya un mapeo 1 a 1 entre una secuencia de bits buena, aceptable y no perjudicial conocida a otra secuencia literal de bits, y que la aplicación de manejo no distinga la codificación.
En su ejemplo,
man
puede ser ASCII válido en primera forma; pero a menudo puede querer transmitir valores que sean binarios aleatorios (es decir, enviar una imagen en un correo electrónico):Aquí vemos que una imagen GIF está codificada en base64 como un fragmento de un correo electrónico. El cliente de correo electrónico lee los encabezados y lo decodifica. Debido a la codificación, podemos estar seguros de que el GIF no contiene nada que pueda interpretarse como protocolo y evitamos insertar datos que SMTP o POP puedan encontrar significativos.
fuente
Base64 en lugar de escapar caracteres especiales
Te daré un ejemplo muy diferente pero real: escribo el código de JavaScript para que se ejecute en un navegador. Las etiquetas HTML tienen valores de ID, pero existen restricciones sobre qué caracteres son válidos en una ID.
Pero quiero que mi ID haga referencia sin pérdida a los archivos en mi sistema de archivos. Los archivos en realidad pueden tener todo tipo de personajes extraños y maravillosos en ellos, desde signos de exclamación, caracteres acentuados, tilde, ¡incluso emoji! No puedo hacer esto:
Supongamos que quiero ejecutar un código como este:
Creo que este código fallará cuando se ejecute.
Con Base64 puedo referirme a algo complicado sin preocuparme por qué idioma permite qué caracteres especiales y cuáles necesitan escapar:
A diferencia del uso de un MD5 o alguna otra función de hash, puede invertir la codificación para averiguar exactamente qué datos fueron realmente útiles.
Desearía saber sobre Base64 hace años. Hubiera evitado arrancarme el pelo con '
encodeURIComponent
' ystr.replace(‘\n’,’\\n’)
Transferencia de texto SSH:
Si está tratando de pasar datos complejos a través de ssh (por ejemplo, un archivo de puntos para que pueda obtener sus personalizaciones de shell), buena suerte haciéndolo sin Base 64. Así es como lo haría con base 64 (sé que puede usar SCP, pero eso requeriría múltiples comandos, lo que complica las combinaciones de teclas para sshing en un servidor):
fuente
Un ejemplo de cuando me pareció conveniente fue cuando trataba de incrustar datos binarios en XML . El analizador SAX malinterpretó algunos de los datos binarios porque esos datos podrían ser literalmente cualquier cosa, incluidos caracteres especiales XML. La base64 que codifica los datos en el extremo transmisor y los decodifica en el extremo receptor solucionó ese problema.
fuente
La mayoría de las computadoras almacenan datos en formato binario de 8 bits, pero esto no es un requisito. Algunas máquinas y medios de transmisión solo pueden manejar 7 bits (o quizás incluso menos) a la vez. Tal medio interpretaría el flujo en múltiplos de 7 bits, por lo que si enviara datos de 8 bits, no recibirá lo que espera del otro lado. Base-64 es solo una forma de resolver este problema: codifica la entrada en un formato de 6 bits, la envía a través de su medio y la decodifica de nuevo en formato de 8 bits en el extremo receptor.
fuente
Además de las otras respuestas (algo largas): incluso ignorando los sistemas antiguos que solo admiten ASCII de 7 bits, los problemas básicos con el suministro de datos binarios en modo de texto son:
fuente
Que esos protocolos fueron diseñados para manejar texto (a menudo, solo texto en inglés ) en lugar de datos binarios (como imágenes .png y .jpg).
Pero la conversación no es verdadera. Un protocolo diseñado para representar texto puede tratar incorrectamente los datos binarios que contienen:
Por lo tanto, no puede simplemente enviar datos binarios a través de un protocolo basado en texto. Está limitado a los bytes que representan los caracteres ASCII sin control sin espacio, de los cuales hay 94. La razón por la que se eligió Base 64 fue que es más rápido trabajar con potencias de dos, y 64 es el más grande que funciona .
En la Web, al menos, en su mayoría lo tienen. La mayoría de los sitios usan UTF-8 .
El problema en Occidente es que hay una gran cantidad de software antiguo que tiene ese carácter de 1 byte = 1 y no puede funcionar con UTF-8.
El problema en Oriente es su apego a codificaciones como GB2312 y Shift_JIS.
Y el hecho de que Microsoft parece no haberse superado después de haber elegido la codificación UTF incorrecta. Si desea utilizar la API de Windows o la biblioteca de tiempo de ejecución de Microsoft C, está limitado a UTF-16 o la codificación "ANSI" de la configuración regional. Esto hace que sea doloroso usar UTF-8 porque tienes que convertir todo el tiempo.
fuente
¿Por qué / cómo utilizamos la codificación Base64?
Base64 es uno de los esquemas de codificación de binario a texto que tiene un 75% de eficiencia. Se utiliza para que los datos binarios típicos (como las imágenes) se puedan enviar de forma segura a través de canales heredados "no limpios de 8 bits". En redes de correo electrónico anteriores (hasta principios de la década de 1990), la mayoría de los mensajes de correo electrónico eran texto sin formato en el conjunto de caracteres US-ASCII de 7 bits. Muchos de los primeros estándares de protocolo de comunicación fueron diseñados para funcionar a través de enlaces de comunicación de "7 bits" "no limpios de 8 bits". La eficiencia del esquema es la relación entre el número de bits en la entrada y el número de bits en la salida codificada. Hexadecimal (Base16) también es uno de los esquemas de codificación de binario a texto con un 50% de eficiencia.
Pasos de codificación Base64 (simplificados):
fuente
En el día en que ASCII gobernaba el mundo, lidiar con valores no ASCII era un dolor de cabeza. La gente saltó a través de todo tipo de aros para transferirlos a través del cable sin perder información.
fuente