La codificación Base64 es un proceso de conversión de datos binarios a un formato de cadena ASCII al convertir esos datos binarios en una representación de caracteres de 6 bits. El método de codificación Base64 se utiliza cuando los datos binarios, como imágenes o video, se transmiten a través de sistemas que están diseñados para transmitir datos en formato de texto sin formato (ASCII).
¿Por qué se utiliza la codificación Base64?
La necesidad de la codificación Base64 proviene de los problemas que ocurren cuando los medios se transmiten en formato binario sin procesar a sistemas basados en texto.
Dado que los sistemas basados en texto (como el correo electrónico) interpretan los datos binarios como una amplia gama de caracteres, incluidos los caracteres de comando especiales, esos sistemas malinterpretan gran parte de los datos binarios que se transmiten para transferir medios y se pierden o corrompen en el proceso de transmisión.
Un método para codificar este tipo de datos binarios de una manera que evite tales problemas de transmisión es enviarlos como texto ASCII sin formato en formato codificado Base64. Esta es una de las técnicas empleadas por el estándar MIME para enviar datos que no sean texto sin formato.
Muchos lenguajes de programación, como PHP y Javascript, incluyen funciones de codificación y decodificación Base64 para interpretar los datos transmitidos mediante la codificación Base64.
Lógica de codificación Base64
La codificación Base64 divide los datos binarios en segmentos de 6 bits de 3 bytes completos y los representa como caracteres imprimibles en el estándar ASCII. Lo hace esencialmente en dos pasos.
El primer paso es dividir la cadena binaria en bloques de 6 bits. Base64 solo usa 6 bits (correspondientes a 2^6=64 caracteres) para garantizar que los datos codificados sean imprimibles y legibles por humanos. 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 el signo más (+) y la barra inclinada (/). También hay un carácter 65 conocido como pad, que es el signo igual (=). Este carácter se usa cuando el último segmento de datos binarios no contiene 6 bits completos.
Ejemplo de codificación Base64
Por ejemplo, tome tres números ASCII 155, 162 y 233. Estos tres números constituyen un flujo binario de 100110111010001011101001. Un archivo binario, como una imagen, contiene un flujo binario que se ejecuta durante decenas o cientos de miles de ceros y unos.
Un codificador Base64 comienza fragmentando el flujo binario en grupos de seis caracteres: 100110 111010 001011 101001. Cada uno de estos grupos se traduce en los números 38, 58, 11 y 41.
Un flujo binario de seis caracteres convierte caracteres binarios (o base 2) a caracteres decimales (base 10) elevando al cuadrado cada valor representado por un 1 en la secuencia binaria con su cuadrado posicional. Comenzando desde la derecha y moviéndose hacia la izquierda, y comenzando desde cero, los valores en el flujo binario representan 2^0, luego 2^1, luego 2^2, luego 2^3, luego 2^4, luego 2^5.
Aquí hay otra forma de verlo. Comenzando desde la izquierda, cada posición vale 1, 2, 4, 8, 16 y 32. Si el número binario tiene un 1 en la ranura, agrega ese valor; si tiene un 0 en la ranura, no lo tiene. La cadena binaria 100110 se convierte al número decimal 38: 02^01 + 12^1 + 12^2 + 02^3 + 02^4 + 12^5=0+2 +4+0+0+32.
La codificación Base64 toma esta cadena binaria y la divide en los valores de 6 bits 38, 58, 11 y 41.
Finalmente, estos números se convierten a caracteres ASCII utilizando la tabla de codificación Base64. Los valores de 6 bits de este ejemplo se traducen a la secuencia ASCII m6Lp.
Uso de la tabla de conversión Base64:
- 38 es m
- 58 es 6
- 11 es L
- 41 es p
Este proceso de dos pasos se aplica a toda la cadena binaria codificada.
Para garantizar que los datos codificados se puedan imprimir 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 la longitud de línea por debajo de 76 caracteres. Los caracteres de nueva línea se codifican como todos los demás datos.
Todo el propósito de la codificación Base64, desde agregar relleno para preservar segmentos binarios de 3 bytes hasta convertir binario a texto usando la tabla Base64, es preservar la integridad de la información binaria transmitida.
Tabla de codificación Base64
La siguiente tabla traduce los 64 caracteres utilizados en la codificación Base64.
Tabla de codificación Base64 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
Valor | Char | Valor | Char | Valor | Char | Valor | Char | |||
0 | A | 16 | Q | 32 | g | 48 | w | |||
1 | B | 17 | R | 33 | h | 49 | x | |||
2 | C | 18 | S | 34 | i | 50 | y | |||
3 | D | 19 | T | 35 | j | 51 | z | |||
4 | E | 20 | U | 36 | k | 52 | 0 | |||
5 | F | 21 | V | 37 | l | 53 | 1 | |||
6 | G | 22 | M | 38 | m | 54 | 2 | |||
7 | H | 23 | X | 39 | 55 | 3 | ||||
8 | Yo | 24 | Y | 40 | o | 56 | 4 | |||
9 | J | 25 | Z | 41 | p | 57 | 5 | |||
10 | K | 26 | un | 42 | q | 58 | 6 | |||
11 | L | 27 | b | 43 | r | 59 | 7 | |||
12 | M | 28 | c | 44 | s | 60 | 8 | |||
13 | N | 29 | d | 45 | t | 61 | 9 | |||
14 | O | 30 | e | 46 | u | 62 | + | |||
15 | P | 31 | f | 47 | v | 63 | / |
Resolviendo el final del juego
Al final del proceso de codificación, puede haber un problema. Si el tamaño de los datos originales en bytes es un múltiplo de tres, todo funciona bien. Si no es así, puede haber bytes vacíos. Para una codificación adecuada, se necesitan exactamente 3 bytes de datos binarios.
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 los datos necesitan un byte adicional de datos, uno se agrega para dos bytes adicionales.
Por supuesto, estos '0' artificiales no se pueden codificar usando la tabla de codificación a continuación. Deben estar representados por un carácter 65. El carácter de relleno de Base64 es el signo igual (=) y se coloca al final de los datos codificados.