PHP 较大的数的进制转换问题

问题:

        在开发卡片下发到设备中时,本地数据库存储的十进制的数据,设备刷卡后识别到的是卡片内置16进制数据(例:127800700200878e30018649410123009579),正常处理时采用dechex方法处理,但是发现转换的数据变成了7FFFFFFFFFFFFFFFF

原因:

        排查后发现php进制转换方法有最大数值限制(具体可以查看官方文档)

解决方法:

        最后采用自己写一个进制转换方法来使用

/**
 * @param string $from 需要转换的字符串
 * @param int $targetRadix 目标进制
 * @param int $fromRadix 源进制 默认10
 */
function radixTransform(string $from, $targetRadix, $fromRadix = 10)
{
    /**
     * 转换为十进制
     * 原理:r进制数abcd转换为十进制则为:a*r^3+b*r^2+c*r^1+d*r^0
     */
    // 转换为小写
    $from = strtolower($from); 
    // 获取字符串长度 
    $fromLenth = strlen($from);
    $dec = 0;
    for($i = 0; $i < $fromLenth; $i++){
        // 获取字符的ASCII码
        $asciiCode = ord($from[$i]);    
        if($asciiCode >= 48 && $asciiCode <= 57){   // 如果是0-9
            $asciiNumber = (int)$from[$i];
        }elseif($fromRadix > 10 && $asciiCode >= 97 && $asciiCode <= 122){  // 如果是a-z
            $asciiNumber = $asciiCode - 87; // - 97 + 10
        }else{
            throw new Exception("There are characters that are not allowed ['{$from[$i]}' index {$i}]");
        }
        // php默认计算有大小限制
        $dec = bcadd($dec,bcmul($asciiNumber,bcpow($fromRadix,$fromLenth-$i-1)));
    }

    /**
     * 转换为目标进制
     * 原理:上面的原理反转过来理解
     */
    $result = '';
    while($dec > 0){
        $remainder = bcmod($dec,$targetRadix);

        $result = dechex($remainder).$result;

        $dec = bcdiv(bcsub($dec,$remainder),$targetRadix);
    }
    return $result;
}

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值