php如何把一個20位的62進位的轉回10進位字串。
目前通過
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; }
可以把超長的十進位整數轉到62進位,但是由於系統限制,轉回來的時候會變成9.9999999991447E+27
這樣的數字。
需要一個演算法,把超長的62進位轉回10進位字串。
可以用下面這個數字測試
9999999999144705880199999999999
回複內容:
php如何把一個20位的62進位的轉回10進位字串。
目前通過
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; }
可以把超長的十進位整數轉到62進位,但是由於系統限制,轉回來的時候會變成9.9999999991447E+27
這樣的數字。
需要一個演算法,把超長的62進位轉回10進位字串。
可以用下面這個數字測試
9999999999144705880199999999999
請使用 BCMath 做任意精度的加減乘除。
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";
首先,樓主的演算法是不對的,因為我用9999999999144705880199999999999和9999999999144705880199999999998這個數測dec62(),發現輸出結果是一樣的。
我在php手冊中看到了大神的演算法(需要BCMath支援):
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
用法:
1、十進位轉62進位
echo convBase('9999999999144705880199999999999','0123456789','0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
2、62進位轉十進位
echo convBase('3nLqycbr6ZQsN1JJYX','0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ','0123456789');
它支援任意形式的進位轉換,詳見 http://php.net/manual/en/function.base-convert.php