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):
Base36 is a binary-to-text encoding scheme that represents binary data in an ASCII string format by translating it into a radix-36 representation. The choice of 36 is convenient in that the digits can be represented using the Arabic numerals 0–9 and the Latin letters A–Z (the ISO basic Latin alphabet).
Converting a decimal number to other base numbers is easy. We have to divide the decimal number by the converted value of the new base. Decimal to Binary Number: Suppose if we have to convert decimal to binary, then divide the decimal number by 2.
Step 1 − Divide the decimal number to be converted by the value of the new base. Step 2 − Get the remainder from Step 1 as the rightmost digit (least significant digit) of new base number. Step 3 − Divide the quotient of the previous divide by the new base.
Converting a base-10 number to a hexadecimal works much like converting a base-10 number to a binary number. You divide the number by the exponent (16) and keep dividing the result until the quotient is 0. At each step you multiply the remainder by 16 to get the hex value.
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?
http://www.pgregg.com/projects/php/base_conversion/base_conversion.php
This page show you how to convert arbitrary length numbers between different bases. I tried your example and it looks like it works in both directions. Source code written in PHP is available.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With