PHP - Как к base_convert () для базирования 62

Мне нужен a base_convert() функция, которая работает от основы 2 для базирования 62, но я пропускаю математику, которую я должен использовать, я знаю, что из-за ограничений PHP должен использовать bcmath, который прекрасен.

Функции как они преобразовывают число в и от основы 10 к другой основе до 62, но я хочу реализовать ту же функциональность base_convert(), например: единственная функция, которая может преобразовать между произвольными основаниями.

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

Вот более читаемая версия функции:

function bc_base_convert($value, $quellformat, $zielformat)
{
    $vorrat = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    if (min($quellformat, $zielformat) < 2)
    {
        trigger_error('Bad Format min: 2', E_USER_ERROR);
    }

    if (max($quellformat, $zielformat) > strlen($vorrat))
    {
        trigger_error('Bad Format max: ' . strlen($vorrat), E_USER_ERROR);
    }

    $dezi = '0';
    $level = 0;
    $result = '';
    $value = trim(strval($value), "\r\n\t +");
    $vorzeichen = '-' === $value{0} ? '-' : '';
    $value = ltrim($value, "-0");
    $len = strlen($value);

    for ($i = 0; $i < $len; $i++)
    {
        $wert = strpos($vorrat, $value{$len - 1 - $i});

        if (FALSE === $wert)
        {
            trigger_error('Bad Char in input 1', E_USER_ERROR);
        }

        if ($wert >= $quellformat)
        {
            trigger_error('Bad Char in input 2', E_USER_ERROR);
        }

        $dezi = bcadd($dezi, bcmul(bcpow($quellformat, $i), $wert));
    }

    if (10 == $zielformat)
    {
        return $vorzeichen . $dezi; // abkürzung
    }

    while (1 !== bccomp(bcpow($zielformat, $level++), $dezi));

    for ($i = $level - 2; $i >= 0; $i--)
    {
        $factor = bcpow($zielformat, $i);
        $zahl = bcdiv($dezi, $factor, 0);
        $dezi = bcmod($dezi, $factor);
        $result .= $vorrat{$zahl};
    }

    $result = empty($result) ? '0' : $result;

    return $vorzeichen . $result;
}

Кто-либо может объяснить меня вышеупомянутая функция или дать мне некоторые световые сигналы на процессе прямого преобразования между произвольными основаниями?

8
задан Alix Axel 21 December 2009 в 03:34
поделиться

2 ответа

I wrote about using the BCMath functions for decimal/binary conversion here: http://www.exploringbinary.com/base-conversion-in-php-using-bcmath/ . You could easily modify that code to convert to different bases.

For example, in the case of converting integers, modify routines dec2bin_i() and bin2dec_i(). Rename them and add a base parameter -- something like dec2base_i($base,$decimal_i) and base2dec_i($base,$num_i), change the hardcoded '2' to the variable $base, convert the numeric remainders to/from characters of the base, and rename the variables.

Now, to convert between arbitrary bases, use decimal as an intermediate and call both those new functions. For example, convert base 42 number "123" to base 59 by calling $dec = base2dec_i('42','123') followed by $b59 = dec2base_i(59,$dec).

(You could also make a combined function that does it in one call.)

0
ответ дан 5 December 2019 в 07:35
поделиться

Самый простой подход к любым проблемам перевода, от числовой системы до естественных языков, - это перевод в промежуточном формате.

function bc_base_convert($num, $from, $to) {
    return bc_convert_to(bc_parse_num($num, $from), $to);
}

Теперь все, что вам нужно написать, это bc_convert_to и bc_parse_num . Если платформа различает числовые типы, вам нужно это принять во внимание. Кроме того, числа с плавающей запятой требуют особого рассмотрения, потому что число может иметь конечное представление в одном основании, но не в другом (например, 1/3 равно 0,1 3 , но 0,333 ... 10 , и 1/10 10 равно .0001100110011 ... 2 ).

Что касается обобщенного объяснения того, как работает преобразование, рассмотрим, как позиционные базовые системы Работа. Числительное в форме "a n a n-1 ...

1
ответ дан 5 December 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: