2012-05-06 23 views
5

Quiero convertir números en la base 36 usando PHP. La función base_convert no funciona porque quiero convertir números grandes: no obtengo mi número inicial si lo vuelvo a convertir de la base 36 a decimal.Conversiones entre decimal y base 36

Probé algunas funciones en varios sitios web, pero nunca obtengo el mismo resultado. Además, estos dos sitios web (en Javascript) dan el mismo resultado:

Por ejemplo 1010701001118000000000000000 tiene que ser convertido a 3IZS0ZE1RQ68W8SSW4.

Estas son las funciones que he probado (y que no funcionan):

+0

¿por qué no convertir su número en una cadena y luego codificar con base64? –

+0

La idea es reducir la longitud del número. – Yoone

+0

¿Necesita convertir el número nuevamente a decimal en algún punto? – Niko

Respuesta

8

Éstos son dos funciones simples usando un algoritmo que se encuentra en Wikipedia, durante el uso de bcmath para obtener los cálculos, incluso en caso de grandes números de la derecha:

function fromDecimalToBase($in, $to) { 
    $in = (string) $in; 
    $out = ''; 

    for ($i = strlen($in) - 1; $i >= 0; $i--) { 
     $out = base_convert(bcmod($in, $to), 10, $to) . $out; 
     $in = bcdiv($in, $to); 
    } 

    return preg_replace('/^0+/', '', $out); 
} 

function fromBaseToDecimal($in, $from) { 
    $in = (string) $in; 
    $out = ''; 

    for ($i = 0, $l = strlen($in); $i < $l; $i++) { 
     $x = base_convert(substr($in, $i, 1), $from, 10); 
     $out = bcadd(bcmul($out, $from), $x); 
    } 

    return preg_replace('/^0+/', '', $out); 
} 

Sin embargo, consigo 3izs0ze1rq66tifrpc para el número que usted ha proporcionado - tal vez tu conversión fue incorrecta allí?

+0

Obtiene el mismo resultado que la otra respuesta, tal vez los convertidores de Javascript están equivocados ... Pero no sé cómo averiguarlo. Es posible que deba encontrar un convertidor "perfecto" para saber ... – Yoone

+0

@Yoone He vuelto a convertir la conversión a decimal, y parece funcionar hasta ahora. – Niko

+0

Pero, puedo usar solo el primero y simplemente cambiar '$ from' y' $ to' :). Lo que sea, veo que usas la función PHP 'base_convert', así que creo que tu conversión es la correcta. Aceptaré tu respuesta, gracias! – Yoone

3

http://www.pgregg.com/projects/php/base_conversion/base_conversion.php

Esta página muestra cómo convertir números de longitud arbitrarios entre diferentes bases. He probado su ejemplo y parece que funciona en ambas direcciones. El código fuente escrito en PHP está disponible.

+0

No sé qué código es el correcto, pero con su enlace, obtengo '3IZS0ZE1RQ66TIFRPC' en lugar de' 3IZS0ZE1RQ68W8SSW4' – Yoone

+0

+1 porque la respuesta que acepté arroja el mismo resultado. – Yoone

Cuestiones relacionadas