2012-05-06 18 views
5

Voglio convertire i numeri in base 36 usando PHP. La funzione base_convert non funziona perché voglio convertire grandi numeri: non ottengo il mio numero iniziale se lo converto di nuovo dalla base 36 al decimale.Conversioni tra decimale e base 36

Ho provato alcune funzioni fornite su più siti Web, ma non ottengo mai lo stesso risultato. Inoltre, questi due siti web (in Javascript) danno lo stesso risultato:

Per esempio 1010701001118000000000000000 deve essere convertito in 3IZS0ZE1RQ68W8SSW4.

Qui ci sono le funzioni che ho provato (e che non funzionano):

+0

perché non convertire il numero in stringa e quindi eseguire la codifica con base64? –

+0

L'idea è di ridurre la lunghezza del numero. – Yoone

+0

Hai bisogno di convertire il numero in decimale ad un certo punto? – Niko

risposta

8

Qui ci sono due semplici funzioni utilizzando un algoritmo trovato su Wikipedia, mentre usando bcmath per ottenere i calcoli anche per grandi numeri giusti:

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); 
} 

Tuttavia, ho 3izs0ze1rq66tifrpc per il numero che ci hai fornito - forse la tua conversione era sbagliata lì?

+0

Hai lo stesso risultato dell'altra risposta, forse i convertitori Javascript sono sbagliati ... Ma non so come scoprirlo. Potrei dover trovare un convertitore "perfetto" per sapere ... – Yoone

+0

@Yoone Ho aggiunto la conversione in decimale e sembra che funzioni fino ad ora. – Niko

+0

Ma, posso usare solo il primo e basta scambiare "$ da" e "$ a" :). In ogni caso, vedo che usi la funzione PHP 'base_convert', quindi penso che la tua conversione sia quella giusta. Accetterò la tua risposta, grazie! – Yoone

3

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

Questa pagina mostra come convertire numeri di lunghezza arbitrari tra diverse basi. Ho provato il tuo esempio e sembra che funzioni in entrambe le direzioni. Il codice sorgente scritto in PHP è disponibile.

+0

Non so quale codice sia corretto, ma con il tuo link, ricevo '3IZS0ZE1RQ66TIFRPC' invece di' 3IZS0ZE1RQ68W8SSW4' – Yoone

+0

+1 perché la risposta che ho accettato restituisce lo stesso risultato. – Yoone

Problemi correlati