Todos reconocemos un texto en base32 IVQXIIDUNBSSA4TJMNUA==== ¿Pero como funciona? ¿Que implementaciones hay? ¿Hay lib-base32-dev o similares?
La respuesta a todo esto es no (Al menos no directamente, si hay implementaciones a través de GNU Core utilities).
Es un algoritmo super sencillo y si bien produce mas información de la que hay, sirve como dialecto univesal, lo cual está bueno para telecomunicaciones a nivel global, pero no tan bueno en ancho de banda, pero creo yo que hoy... con la cantidad de 143 exabytes mensuales me parece que da un poco igual ahorrar en eso ya...
El algoritmo consiste en dividir un input string en bloques de 5 bytes y traducir Los bloques de 5 bytes y sus restos si es que hay) a un alfabeto.
El susodicho alfabeto es el siguiente:
ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 y el caracter especial = para crear "padding" ya que BASE32 consiste en grupos de 40 bits SI o SI.
Ahora hablemos de como se codifica la información, todo el mundo sabe que las computadoras funcionan con codigo binario, es decir 0s y 1s, donde (respectivamente) uno significa ausencia de corriente y el otro presencia de corriente.
Nuestra computadora, le asigna un valor a cada caracter, ese valor es de 1 Byte, osea 8 bits. Y ahora la pregunta natural es ¿Como carajo sabe que valor tiene cada cosa mi compu? Bueno, a través de formatos como UTF-8 o el estandar ASCII (Fuente: Wikipedia).
Entonces la letra f valdria 0x66 en hexadecimal, o 01100110, lo que hace la codificación Base32, es agarrar grupos de 5 bits, y usar el alfabeto que dijimos para codificar el texto dado.
Hay varios casos que pueden darse en base32 (5 especificamente), y es re sencillo.
Acá el tema está en cuantos bytes tenes. En el caso 1 al 4, tenes hasta 4 bytes, osea hasta 32 bits. Por lo que vas a tener que usar padding, y en el caso de tener 5 letras (O un texto multiplo de 5) no vas a tener padding. Copiado y Pegado del RFC 4648, el mismismo documento original estos valores deberia tener foobar en cada caso.
BASE32("") = ""
BASE32("f") = "MY======"
BASE32("fo") = "MZXQ===="
BASE32("foo") = "MZXW6==="
BASE32("foob") = "MZXW6YQ="
BASE32("fooba") = "MZXW6YTB"
BASE32("foobar") = "MZXW6YTBOI======"
¿Se acuerdan que dijimos que f = 01100110? Partamosló en 2 cachos de 5 bits 01100 110XX nos quedan 2 bits vacíos... a esos lo llenamos con 0.
Entonces nos quedan valores ya que el binario, es un sistema numerico al igual que el decimal, entonces, 01100 = 12 y 11000 = 24.
Si tomamos el alfabeto que dije mas arriba, inicia en la posición 0. y termina en la posición 31 (Las matrices son zero-based index)-- Mejor les muestro con una tabla que vale cada cosa...
| Valor decimal | Carácter |
|---|---|
| 0 | A |
| 1 | B |
| 2 | C |
| 3 | D |
| 4 | E |
| 5 | F |
| 6 | G |
| 7 | H |
| 8 | I |
| 9 | J |
| 10 | K |
| 11 | L |
| 12 | M |
| 13 | N |
| 14 | O |
| 15 | P |
| 16 | Q |
| 17 | R |
| 18 | S |
| 19 | T |
| 20 | U |
| 21 | V |
| 22 | W |
| 23 | X |
| 24 | Y |
| 25 | Z |
| 26 | 2 |
| 27 | 3 |
| 28 | 4 |
| 29 | 5 |
| 30 | 6 |
| 31 | 7 |
(Noten que 12 es M y 24 Y ergo NY======. El padding se hace con = como ya dijimos y se ponen 6 porque es un grupo de 40 bits donde cada caracter tiene 5 bits como ya dijimos x2.)
Aprendí como funciona Base32, hice mi propia implementación con operaciones BITWISE, lo cual hace que sea muy util para implementaciones en micro-controladores... y estoy seguro que debe poder mejorarse pero yo ando flojito y la voy a dejar así funcional, solo me queda implementar un decoder, y luego continuar... pero por ahora voy a jugar factorio, hasta mi proxima entrada de blog.