PHP - Wie base_convert () bis zur Basis 62

ich brauche einbase_convert() Funktion, die von Basis 2 bis Basis 62 funktioniert, aber mir fehlt die Mathematik, die ich verwenden muss. Ich weiß, dass ich aufgrund der Einschränkungen von PHP bcmath verwenden muss, was in Ordnung ist.

Funktionenwie diese konvertiere eine Zahl zu und von der Basis 10 zu einer anderen Basis bis zu 62, aber ich möchte die gleiche Funktionalität von implementierenbase_convert()z.B.: eine einzige Funktion, die zwischen beliebigen Basen konvertieren kann.

Ich habe eine gefundenFunktion, die dies zu tun scheintAber es gibt mir das Gefühl, überflüssigen und langsamen Code zu haben, und ich würde es gerne ein wenig optimieren, wenn ich Deutsch könnte, was ich nicht kann. = (

Hier ist eine besser lesbare Version der Funktion:

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

Kann mir jemand die obige Funktion erklären oder mich über den Prozess der direkten Konvertierung zwischen beliebigen Basen informieren?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage