演算法 - php如何把一個20位的62進位的轉回10進位字串

來源:互聯網
上載者:User
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

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.