Search code examples
phpbase36

Convertions between decimal and base 36


I want to convert numbers in base 36 using PHP. The function base_convert is not working because I want to convert large numbers: I don't get my initial number if I convert it again from base 36 to decimal.

I tried some function given on multiple websites, but I never get the same result. Also, these two websites (in Javascript) give the same result:

For example 1010701001118000000000000000 has to be converted to 3IZS0ZE1RQ68W8SSW4.

Here are the functions I tried (and which don't work):


Solution

  • Here are two simple functions using an algorithm found on Wikipedia, while using bcmath to get the calculations even for very large numbers right:

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

    However, I get 3izs0ze1rq66tifrpc for the number you've provided - maybe your conversion was wrong there?