Si Internet es la autopista de la información, entonces el camino para el correo electrónico es un barranco estrecho. Sólo pueden pasar carros muy pequeños.
El sistema de transporte de correo electrónico está diseñado sólo para texto ASCII simple. Tratar de enviar texto en otros idiomas o archivos arbitrarios es como hacer que un camión atraviese el barranco.
Índice de contenidos
¿Cómo pasa el camión grande por el barranco?
Entonces, ¿cómo se envía un camión grande a través de un barranco pequeño? Hay que desmontarlo por un extremo, transportarlo por el barranco y reconstruir el camión a partir de las piezas del otro extremo.
Lo mismo sucede cuando se envía un archivo adjunto por correo electrónico. En un proceso conocido como codificación, los datos binarios se transforman en texto ASCII, que puede ser transportado por correo electrónico sin problemas. Al final del destinatario, los datos se decodifican y se reconstruye el archivo original.
Un método para codificar datos arbitrarios como texto ASCII es Base64. Es una de las técnicas empleadas por el estándar MIME para enviar datos que no sean texto plano.
Base64 al Rescate
La codificación Base64 toma tres bytes, cada uno de los cuales consta de ocho bits, y los representa como cuatro caracteres imprimibles en el estándar ASCII. Lo hace en esencia en dos pasos.
El primer paso es convertir tres bytes en cuatro números de seis bits. Cada carácter del estándar ASCII consta de siete bits. Base64 sólo utiliza 6 bits (correspondientes a 2^6 = 64 caracteres) para asegurar que los datos codificados sean imprimibles y legibles humanamente. No se utiliza ninguno de los caracteres especiales disponibles en ASCII. Los 64 caracteres (de ahí el nombre Base64) son 10 dígitos, 26 caracteres en minúsculas, 26 caracteres en mayúsculas así como `+’ y ` /’.
Si, por ejemplo, los tres bytes son 155, 162 y 233, el flujo de bits correspondiente (y aterrador) es 100110111110100010101110101001, que a su vez corresponde a los valores de 6 bits 38, 58, 11 y 41.
Estos números se convierten en caracteres ASCII en el segundo paso utilizando la tabla de codificación Base64. Los valores de 6 bits de nuestro ejemplo se traducen a la secuencia ASCII «m6Lp».
- 155 -> 10011011
- 162 -> 10100010
- 233 -> 11101001
- 100110 -> 38
- 111010 -> 58
- 001011 -> 11
- 101001 -> 41
- 38 -> m
- 58 -> 6
- 11 -> L
- 41 -> p
Este proceso de dos pasos se aplica a toda la secuencia de bytes codificados. Para asegurar que los datos codificados puedan imprimirse correctamente y no excedan el límite de longitud de línea de ningún servidor de correo, se insertan caracteres de nueva línea para mantener las longitudes de línea por debajo de 76 caracteres. Los nuevos caracteres de línea se codifican como todos los demás datos.
Resolución del juego final
Al final del proceso de codificación, podríamos encontrarnos con un problema. Si el tamaño de los datos originales en bytes es múltiplo de tres, todo funciona bien. Si no lo es, podríamos terminar con uno o dos bytes de 8 bits. Sin embargo, para una codificación correcta, necesitamos exactamente tres bytes.
La solución es añadir suficientes bytes con un valor de ‘0’ para crear un grupo de 3 bytes. Dos de estos valores se añaden si tenemos un byte extra de datos, uno se añade para dos bytes extra.
Por supuesto, estos «0» artificiales no pueden ser codificados usando la tabla de codificación de abajo. Deben estar representados por un carácter número 65. El carácter de relleno de Base64 es ‘=’. Naturalmente, sólo puede aparecer al final de los datos codificados.
Tabla de codificación Base64
ValueCharValueCharValueCharValueChar0A16Q32g48w1B17R33h49x2C18S34i50y3D19T35j51z4E20U36k5205F21V37l5316G22W38m5427H23X39n5538I24I40o5649J25Z41p57510p57510K26a42q58611L27b43r59712M28c44s60813N29d29d45t61914O3030