Rumah >pembangunan bahagian belakang >tutorial php >算法 - php如何把一个20位的62进制的转回10进制字符串
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
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 </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