PHP 10进制转62进制

阅读 (1302)
十进制数转换成62进制与62进制数转换成十进制数,应用场景,将手机号转码缩短位数存储

先解释一下,为什么会出现这种“奇怪的”进制,其实是一种缩短原文字符长度的算法,比如应用到网页短地址中或者将手机号缩短存储等等。

62是由0-9,a-z,A-Z: 10+26+26 == 62,所以缩短的字符串最终只会出现这些字符 


/**
 * 十进制数转换成62进制
 *
 * @param integer $num
 * @return string
 */
function from10_to62($num) {
    $to = 62;
    $dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $ret = '';
    do {
        $ret = $dict[bcmod($num, $to)] . $ret;
        $num = bcdiv($num, $to);
    } while ($num > 0);
    return $ret;
}
/**
 * 62进制数转换成十进制数
 *
 * @param string $num
 * @return string
 */
function from62_to10($num) {
    $from = 62;
    $num = strval($num);
    $dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $len = strlen($num);
    $dec = 0;
    for($i = 0; $i < $len; $i++) {
        $pos = strpos($dict, $num[$i]);
        $dec = bcadd(bcmul(bcpow($from, $len - $i - 1), $pos), $dec);
    }
    return $dec;
}

例如有些业务需要将手机号码缩短长度,就可以把手机号转成62进制

// 手机号转进制后缩短长度
echo "get_char:".from10_to62(150888888888)."<br>";
// 把62进制数转回手机号
echo "get_num:".from62_to10('2EHwoQg')."<br>";

 

更新于:2020-07-22 10:47:46
返回顶部