Преобразования между десятичной и базовой 36
Я хочу конвертировать числа в базе 36, используя PHP. Функция base_convert
не работает, потому что я хочу преобразовать большие числа: я не получу свое начальное число, если я снова преобразовать его из базы 36 в десятичную.
Я попробовал какую-то функцию, заданную на нескольких сайтах, но я никогда не получал тот же результат. Кроме того, эти два сайта (в Javascript) дают одинаковый результат:
- http://www.unitconversion.org/numbers/base-10-to-base-36-conversion.html
- http://www.translatorscafe.com/cafe/units-converter/numbers/calculator/decimal-to-base-36/
Например 1010701001118000000000000000
должен быть преобразован в 3IZS0ZE1RQ68W8SSW4
,
Вот функции, которые я пробовал (и которые не работают):
2 ответа
Вот две простые функции, использующие алгоритм, найденный в Википедии, и в то же время использующие bcmath для правильного вычисления даже для очень больших чисел:
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);
}
Тем не менее, я получаю 3izs0ze1rq66tifrpc
за номер, который вы указали - может быть, ваше обращение было неверным?
http://www.pgregg.com/projects/php/base_conversion/base_conversion.php
На этой странице показано, как преобразовать числа произвольной длины между различными базами. Я попробовал ваш пример, и похоже, что он работает в обоих направлениях. Исходный код, написанный на PHP, доступен.