PHP - 如何将 base_convert() 转换为 base 62

标签 php math base-conversion base62

我需要一个从 2 进制到 62 进制的 base_convert() 函数,但我缺少我需要使用的数学,我知道由于 PHP 的限制我需要使用 bcmath,这很好。

函数 like these 将一个数字与以 10 为底的数字相互转换为另一个以 62 为底的数字,但我想实现与 base_convert() 相同的功能,例如:只有一个函数可以在两者之间进行转换任意碱基。

我找到了一个 function that seems to do this ,但它给我的感觉是有一些冗余和缓慢的代码,如果我懂德语,我想稍微调整一下它,但我不懂。 =(

这是该函数的一个更具可读性的版本:

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

谁能给我解释一下上面的函数,或者给我一些关于任意碱基之间直接转换过程的信息?

最佳答案

从 PHP 5.3.2 开始,bc_math 和 gmp 现在都支持最多 62 个基数,因此您可以这样做:

echo gmp_strval(gmp_init($mynumber, $srcbase), $destbase);

或等效的 bc_math。

关于PHP - 如何将 base_convert() 转换为 base 62,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1938029/

相关文章:

将 10 进制转换为 6 进制

php - Laravel:试图建立关系

PHP - If/Else... 语句 - 语法差异

javascript - 存储来自 php 脚本的信息

algorithm - 如何找到边缘上最接近另一点的点

java - 简单算术字符串的正则表达式

Java基数转换程序给定值、其基数和新基数

php - 任意大小数字的基本转换(PHP)

php - 仅在 "revisit"上随机化图像

arrays - 给定大小为 N 的数组的三个数字的最大乘积