Sobre base64. Para que usarlo, para que no, y como manejarlo
Articulo Original
¿Que es base64?
Base64 no es en principio otra cosa mas que un sistema numérico, el
cual debido a sus características se emplea en muchos ámbitos de la
informática para representar información binaria.
Todos los sistemas de numeración tienen una lista de símbolos que utilizan para representar valores, por ejemplo:
Binario: ’01’
Decimal: ‘0123456789’
Hexadecimal: ‘0123456789ABCDEF’
y para base64 el conjunto es:
‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/’
Como vemos, es un subconjunto de ASCII, y tiene como particularidad que todos sus caracteres son imprimibles, de hecho 64 es la mayor potencia de 2 que permite ser representada por un subconjunto de caracteres ASCII imprimibles, por eso, si pasamos cualquier información a su representación de base64, tenemos la seguridad de que no tendremos problemas al transmitirla, almacenarla o leerla, incluso aunque esta contega los más remotos caracteres unicode, una imagen o un mp3, ya que para convertir algo a base64 trataremos directamente con los bits.
¿Como codificamos en base64?
Veamos (en este ejemplo flagrantemente robado de Wikipedia) como se codifica la palabra “Man”.
Texto de entrada | M | a | n | |||||||||||||||||||||
ASCII | 77 | 97 | 110 | |||||||||||||||||||||
Bits | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
Índice | 19 | 22 | 5 | 46 | ||||||||||||||||||||
Resultado en Base64 | T | W | F | u |
Tenemos que la M es en ASCII el caracter 77 (01001101 en binario), y
como el primer paso para nuestra tarea es convertir la información de
origen en bits (más sobre esto en un momento), transformamos toda la
cadena en una secuencia de unos y ceros, los cuales tomamos en grupos de
a seis.
El primero de estos grupos (010011) representa 19, y si tomamos la
posición 19 en la lista de símbolos de base64 (empezando a contar desde
cero, claro) obtenemos la T, y continuando con este algoritmo llegamos
al resultado “TWFu”.
Caracteres de Relleno
base64 se codifica tomando los bytes de tres como entrada en cuatro
sextetos, o sea de a 24 bits. Cuando esta cantidad no coincide,
completamos con el caracter de relleno “=” los sextetos restantes.
Por ejemplo, si hubiéramos codificado solamente el texto “Ma”,
veríamos que no coincide la cantidad de octetos con la de sextetos,
luego de “TW” me quedaría 0001, por lo que completo con ocho ceros y
obtengo “TWE”. El sexteto vacío que queda se completa con el caraceter
“=” quedando como resultado: “TWE=”
Hasta aquí como se codifica. De la misma manera, podría codificar un
archivo ejecutable, una imagen, archivos de sonido o simplemente como en
este caso, Texto Plano.
Ooops, acabo de decir “texto plano”, pero como bien dice Joel Spolsky (parafraseando a famoso economista que parafraseaba a conocido escritor de ciencia ficción): “No existe tal cosa como el texto plano”. Y acá es donde entra a fastidiarnos la palabra “Encoding”.
Encoding
La representación lógica de una cadena de texto, como puede serlo un
String de .net, se puede convertir a bits de muchas maneras. No es lo
mismo la representación binaria de texto en ASCII que en Unicode, al
respecto recomiendo encarecidamente leer el citado post de Joel Spolsky,
pero lo que quiero destacar ahora a los efectos prácticos de comprender
el código es que, cuando trabamos con texto, este es para nosotros la
representación lógica de la información, la cual se perderá al
momento de trabajar directramente con los bits, y como la conversión de
esta información lógica a bits puede realizarse de muchas maneras
distintas, debemos tener control de este paso al momento de codificar y
decodificar texto en y desde base64.
Una referencia de como se lo hace en Genexus X en adelante:
Una referencia de como se lo hace en Genexus X en adelante:
No hay comentarios:
Publicar un comentario