Si Internet es la autopista de la información, la ruta del correo electrónico es un estrecho barranco. Sólo pueden pasar carritos muy pequeños.
El sistema de transporte de correo electrónico está diseñado solo para texto ASCII simple. Tratar de enviar texto en otros idiomas o archivos arbitrarios es como pasar un camión por el barranco.
¿Cómo pasa el Big Truck por el barranco?
Entonces, ¿cómo enviar un camión grande a través de un pequeño barranco? Tienes que hacerlo pedazos en un extremo, transportar las piezas a través del barranco y reconstruir el camión a partir de las piezas en el otro extremo.
Lo mismo sucede cuando envías un archivo adjunto por correo electrónico. En un proceso conocido como codificación, los datos binarios se transforman en texto ASCII, que se puede transportar por correo electrónico sin problemas. Al final del destinatario, los datos se decodifican y el archivo original se reconstruye.
Un método para codificar datos arbitrarios como texto ASCII simple es Base64. Es una de las técnicas empleadas por el estándar MIME para enviar datos que no sean texto sin formato.
Base64 al rescate
La codificación Base64 toma tres bytes, cada uno de ocho bits, y los representa como cuatro caracteres imprimibles en el estándar ASCII. Lo hace esencialmente en dos pasos.
El primer paso es convertir tres bytes a cuatro números de seis bits. Cada carácter en el estándar ASCII consta de siete bits. Base64 solo usa 6 bits (correspondientes a 2 ^ 6 = 64 caracteres) para garantizar que los datos codificados se puedan imprimir y que se puedan leer humanamente. Ninguno de los caracteres especiales disponibles en ASCII se utilizan.
Los 64 caracteres (de ahí el nombre Base64) son 10 dígitos, 26 caracteres en minúscula, 26 caracteres en mayúscula, así como '+' y '/'.
Si, por ejemplo, los tres bytes son 155, 162 y 233, el flujo de bits correspondiente (y aterrador) es 100110111010001011101001, que a su vez corresponde a los valores de 6 bits 38, 58, 11 y 41.
Estos números se convierten a 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 garantizar 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 caracteres de nueva línea están codificados como todos los demás datos.
Resolviendo el final del juego
Al final del proceso de codificación, podemos encontrarnos con un problema. Si el tamaño de los datos originales en bytes es un múltiplo de tres, todo funciona bien. Si no lo es, podemos terminar con uno o dos bytes de 8 bits. Sin embargo, para una codificación adecuada, necesitamos exactamente tres bytes.
La solución es agregar suficientes bytes con un valor de '0' para crear un grupo de 3 bytes. Dos de estos valores se agregan si tenemos un byte adicional de datos, uno se agrega por dos bytes adicionales.
Por supuesto, estos '0' finales no pueden codificarse usando la siguiente tabla de codificación. Deben estar representados por un personaje número 65.
El carácter de relleno Base64 es '='. Naturalmente, solo puede aparecer al final de los datos codificados.
Tabla de codificación Base64
Valor | Carbonizarse | Valor | Carbonizarse | Valor | Carbonizarse | Valor | Carbonizarse | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | UNA | 16 | Q | 32 | sol | 48 | w | |||
1 | segundo | 17 | R | 33 | h | 49 | X | |||
2 | do | 18 | S | 34 | yo | 50 | y | |||
3 | re | 19 | T | 35 | j | 51 | z | |||
4 | mi | 20 | U | 36 | k | 52 | 0 | |||
5 | F | 21 | V | 37 | l | 53 | 1 | |||
6 | sol | 22 | W | 38 | metro | 54 | 2 | |||
7 | H | 23 | X | 39 | norte | 55 | 3 | |||
8 | yo | 24 | Y | 40 | o | 56 | 4 | |||
9 | J | 25 | Z | 41 | pag | 57 | 5 | |||
10 | K | 26 | una | 42 | q | 58 | 6 | |||
11 | L | 27 | segundo | 43 | r | 59 | 7 | |||
12 | METRO | 28 | do | 44 | s | 60 | 8 | |||
13 | norte | 29 | re | 45 | t | 61 | 9 | |||
14 | O | 30 | mi | 46 | tu | 62 | + | |||
15 | PAG | 31 | F | 47 | v | 63 | / |