Преобразования между десятичной и базовой 36

Я хочу конвертировать числа в базе 36, используя PHP. Функция base_convert не работает, потому что я хочу преобразовать большие числа: я не получу свое начальное число, если я снова преобразовать его из базы 36 в десятичную.

Я попробовал какую-то функцию, заданную на нескольких сайтах, но я никогда не получал тот же результат. Кроме того, эти два сайта (в Javascript) дают одинаковый результат:

Например 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, доступен.

Другие вопросы по тегам