• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

算法 – php如何把一个20位的62进制的转回10进制字符串

php 搞代码 3年前 (2022-01-25) 12次浏览 已收录 0个评论
文章目录[隐藏]

php如何把一个20位的62进制的转回10进制字符串。
目前通过

<code>    function dec62($n) {        $base = 62;        $index = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';        $ret = '';        for($t = floor(log10($n) / log10($base)); $t >= 0; $t --) {    <strong style="color:transparent">9来源gaodai#ma#com搞@代~码$网</strong>搞gaodaima代码        $a = floor($n / pow($base, $t));            $ret .= substr($index, $a, 1);            $n -= $a * pow($base, $t);        }        return $ret;    }</code>

可以把超长的十进制整数转到62进制,但是由于系统限制,转回来的时候会变成9.9999999991447E+27这样的数字。
需要一个算法,把超长的62进制转回10进制字符串。
可以用下面这个数字测试
9999999999144705880199999999999

回复内容:

php如何把一个20位的62进制的转回10进制字符串。
目前通过

<code>    function dec62($n) {        $base = 62;        $index = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';        $ret = '';        for($t = floor(log10($n) / log10($base)); $t >= 0; $t --) {            $a = floor($n / pow($base, $t));            $ret .= substr($index, $a, 1);            $n -= $a * pow($base, $t);        }        return $ret;    }</code>

可以把超长的十进制整数转到62进制,但是由于系统限制,转回来的时候会变成9.9999999991447E+27这样的数字。
需要一个算法,把超长的62进制转回10进制字符串。
可以用下面这个数字测试
9999999999144705880199999999999

请使用 BCMath 做任意精度的加减乘除。

<code>function base62to10($n){    $index = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';    $n = strval($n);    $len = strlen($n);    $result = 0;    $base = 1;    for ($i = $len-1; $i >= 0; $i--) {        $char = $n[$i];        $d = strpos($index, $char);        assert($d !== false);        $result = bcadd($result, bcmul($d, $base));        $base = bcmul($base, 62);    }    return $result;}echo base62to10('9999999999144705880199999999999'),"\n";</code>

首先,楼主的算法是不对的,因为我用9999999999144705880199999999999和9999999999144705880199999999998这个数测dec62(),发现输出结果是一样的。
我在php手册中看到了大神的算法(需要BCMath支持):

<code class="php">    function convBase($numberInput, $fromBaseInput, $toBaseInput){        if ($fromBaseInput==$toBaseInput) return $numberInput;        $fromBase = str_split($fromBaseInput,1);        $toBase = str_split($toBaseInput,1);        $number = str_split($numberInput,1);        $fromLen=strlen($fromBaseInput);        $toLen=strlen($toBaseInput);        $numberLen=strlen($numberInput);        $retval='';        if ($toBaseInput == '0123456789')        {            $retval=0;            for ($i = 1;$i <= $numberLen; $i++)                $retval = bcadd($retval, bcmul(array_search($number[$i-1], $fromBase),bcpow($fromLen,$numberLen-$i)));            return $retval;        }        if ($fromBaseInput != '0123456789')            $base10=convBase($numberInput, $fromBaseInput, '0123456789');        else            $base10 = $numberInput;        if ($base10<strlen($toBaseInput))            return $toBase[$base10];        while($base10 != '0')        {            $retval = $toBase[bcmod($base10,$toLen)].$retval;            $base10 = bcdiv($base10,$toLen,0);        }        return $retval;    }</code>

用法:
1、十进制转62进制

<code class="php">echo convBase('9999999999144705880199999999999','0123456789','0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');</code>

2、62进制转十进制

<code class="php">echo convBase('3nLqycbr6ZQsN1JJYX','0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ','0123456789');</code>

它支持任意形式的进制转换,详见 http://php.net/manual/en/function.base-convert.php


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:算法 – php如何把一个20位的62进制的转回10进制字符串

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址