• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > php如何把一个20位的62进制的转回10进制字符串

php如何把一个20位的62进制的转回10进制字符串

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了php 16进制转字符串,php 字符串转十六进制,php 字符串转二进制,php 二进制,php 16进制转10进制等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:php如何把一个20位的62进制的转回10进制字符串
描述:

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


解决方案1:

首先,楼主的算法是不对的,因为我用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<strlen($toBaseInput))
            return $toBase[$base10];
        while($base10 != '0')
        {
            $retval = $toBase[bcmod($base10,$toLen)].$retval;
            $base10 = bcdiv($base10,$toLen,0);
        }
        return $retval;
    }

用法:
1、十进制转62进制

echo convBase('9999999999144705880199999999999','0123456789','0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');

2、62进制转十进制

echo convBase('3nLqycbr6ZQsN1JJYX','0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ','0123456789');

它支持任意形式的进制转换,详见 http://php.net/manual/en/function.base-convert.php

解决方案2:

请使用 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";


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • php如何把一个20位的62进制的转回10进制字符串

相关文章

  • 2017-06-07 请问使用动态语言的同学们是如何开发的
  • 2017-06-07 DLL调用TSOCKETCONNECTION
  • 2017-06-07 python时间函数中的W周数问题
  • 2017-06-07 sed匹配JSON数据中的数字
  • 2017-06-07 Eric5不能输入中文,英文能输入,我按了中文包
  • 2017-06-07 七牛通过Ajax上传图片偶尔返回base64格式,求解!!!
  • 2017-06-07 使用七牛后感觉手机访问网站变慢
  • 2017-06-07 客户支持系统密码和网站的不一样
  • 2017-06-07 ajax提交数据时,如何用正则表达式替换掉"号?
  • 2017-06-07 是否支持在删除一个m3u8文件时,自动删除与之相关的所有切片?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 在Flask中,如何在blueprint中接受signals
    • 利用七牛的phpSDK分片上传时如何处理Notify?
    • pythontime函数返回的一个又像对象,又像元祖的东西是什么鬼?
    • 如何遍历Python中的DBM数据?
    • (flask)阿里云连pipinstall都无法成功
    • 关于邻接表存储图的问题
    • (python)pycharmreturnoutsideoffunction
    • redisconf如何配置多个局域网服务器可以访问?
    • 回调安全性数据签名结果不一致
    • (python)用supervisor管理后台进程为什么stop掉了之前开启的应用,但是发现其实还是在运行,因为通过浏览器还是能访问?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有