lunes, 27 de marzo de 2017

Conversión de un número decimal a base 64

En esta post les comparto como convertir un número decimal a un número en base 64.

Este caso es muy útil para crear llaves únicas  a partir de un número long, como puede ser el Timestamp, obteniendo un identificador con una cantidad de caracteres menores a los que pude ser representado por el Timestamp.

Este código tiene las siguientes características


  • El algoritmo utiliza un sistema numérico base 64, lo cual significa que tiene 64 símbolos para representar un número decimal.
  • La función toBase64 es la función principal la cual esta encargada de convertir un número de tipo entero (long) a su representación numérica de base 64, representada en un string.
  • La función secundaría toSingleBase estará encargada de convertir un numero menor a 64 a su representación en el sistema numérico base 64.
  • Los caracteres utilizados son los número del 0 al 9, las letras mayúscula y minúsculas, sin caracteres especiales, y dos símbolos adicionales: + y *.



long value = DateTime.Now.Ticks;
string strVal = toBase64(value);

private static string toBase64(int n)
{
    string ret = "";
    int cosiente = 0;
    int residuo = 0;

    if (n < 64)
        return toSingleBase64(n);


    residuo = n / 64;
    cosiente = n % 64;

    ret = toBase64(residuo) + toBase64(cosiente);
    
    return ret;
}

private static string toSingleBase64(int n)
{
    string ret = null;

    if(n < 0)
        ret = "0";
    if (n < 10)
        ret = "" + n;
    else
    {
        if (n >= 10 && n < 36)
        {
            n = n - 10;
            n = 65 + n; //65 inicia el caracte 'A' (Mayusculas)
            ret = "" + (char)n; 
        }
        else if (n >= 36 && n < 62)
        {
            n = n - 36;
            n = 97 + n; //97 inicia el caracte 'a' (minusculas)
            ret = "" + (char)n; 
        }
        else if (n >= 62 && n <= 63)
        {
            n = n - 62;
            n = 42 + n; //42 inicia el caracter '+', seguido por el caracter '*'.
            ret = "" + (char)n;
        }
        else
            ret = "0";
    }
    return ret;
}