免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2110 | 回复: 0
打印 上一主题 下一主题

PHP N进制转换 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-27 01:42 |只看该作者 |倒序浏览

项目: 进制转换
版本: 2.0
团队: 3Vshej
作者: 网游世界
功能: 10进制转换n进制
       n进制转换10进制
Copyright (c) 2008-2009
团队主页:
http://www.3vshej.cn
团队信箱: 3vshej+163.com[+=@]
创建日期: 2008-11-3
修改日期: 2009-11-27
修改说明: 功能增强,优化算法,简化代码。
版权声明: 免费软件

使用说明:
1、转换的数值不能小于0。
2、普通转换最大值不能大于 2147483647。
3、进行进位运算时,最大进制值为,密钥长度除以进位。
当进行1进位的运算时,最大进制值为密钥长度。
4、默认密钥为:0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
html xmlns="http://www.w3.org/1999/xhtml">
head>
meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
title>PHP N进制转换/title>
/head>
body>
?php
/*
* ===========================================
* 项目: 进制转换
* 版本: 2.0
* 团队: 3Vshej
* 作者: 网游世界
* 功能: 10进制转换n进制
        n进制转换10进制
* ===========================================
* Copyright (c) 2008-2009
* 团队主页: http://www.3vshej.cn
* 团队信箱: 3vshej+163.com[+=@]
* 创建日期: 2008-11-3
* 修改日期: 2009-11-27
* 修改说明: 功能增强,优化算法,简化代码。
* 版权声明: 免费软件
* ===========================================
*/
class jinzhi_class{//进制转换类
    var $mishao = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
   
    var $jinwei = 1;
    //定义默认密钥及进位
    function shezhi($ms,$jw){//设置密钥及进位
        $this->mishao = $ms;
        $this->jinwei = $jw;
    }
    function jz_xiao($shu,$jinzhi,$weishu){//小数到N进制转换
    //将$shu转换为$jinzhi,文本长度为$weishu
        $jieguo = "";//存储结果
        $linshi = 1;//临时变量
        $yushu = 1;//存储余数
        $changdu = 1;//存储文本长度
        $jiaoding = $shu;//存储原数值
        //变量初始化
        if ($shu == 0)
            $jieguo = substr($this->mishao,0,$this->jinwei);
        while($shu != 0){
            $linshi = intval($shu / $jinzhi);
            $yushu = $shu % $jinzhi;
            $jieguo = substr($this->mishao,$yushu*$this->jinwei,$this->jinwei).$jieguo;
            $shu = $linshi;
        }
        $changdu = strlen($jieguo);//取结果文本长度
        if ($changdu$weishu)//如果不够位数则补短
            $jieguo = $this->buduan($weishu-$changdu).$jieguo;
        if ($this->fz_xiao($jinzhi,$jieguo)!=$jiaoding)
            return -1;
        return $jieguo;//完成处理,返回结果。
    }
    function fz_xiao($jinzhi,$wenben){//小数进制反转换
        $jieguo = "";
        $changdu = intval(strlen($wenben)/$this->jinwei);
        $weizhi = 1;
        $zifu = "";
        
        for ($i=1;$i=$changdu;$i++){
            if ($this->jinwei>1){
                //多进位进制转换
                $zifu = substr($wenben,$i*$this->jinwei-($this->jinwei),$this->jinwei);
               
                $jieguo += (intval(strpos($this->mishao,$zifu)/$this->jinwei))*pow($jinzhi,$changdu - $i);
                }else{
                    //单进位进制转换
                    $zifu = substr($wenben,$i*$this->jinwei-1,$this->jinwei);
                    $jieguo += intval(strpos($this->mishao,$zifu))*pow($jinzhi,$changdu - $i);
                }
        }
        return $jieguo;//完成处理,返回结果。
    }
    function jz_da($shu,$jinzhi,$weishu){//大数到N进制转换
    //将$shu转换为$jinzhi,文本长度为$weishu
        bcscale(0);
        $jieguo = "";//存储结果
        $linshi = 1;//临时变量
        $yushu = 1;//存储余数
        $changdu = 1;//存储文本长度
        $jiaoding = $shu;//存储原数值
        //变量初始化
        if ($shu == "0")
            $jieguo = substr($this->mishao,0,$this->jinwei);
        while($shu != "0"){
            $linshi = bcdiv($shu,$jinzhi);
            $yushu = bcmod($shu,$jinzhi);
            $jieguo = substr($this->mishao,$yushu*$this->jinwei,$this->jinwei).$jieguo;
            $shu = $linshi;
        }
        $changdu = strlen($jieguo);//取结果文本长度
        if ($changdu$weishu)//如果不够位数则补短
            $jieguo = $this->buduan($weishu-$changdu).$jieguo;
        //echo $jieguo,"
        if ($this->fz_da($jinzhi,$jieguo)!=$jiaoding)
            return -1;
        return $jieguo;//完成处理,返回结果。
    }
    function fz_da($jinzhi,$wenben){//大数进制反转换
        bcscale(0);//设置没有小数位。
        $jieguo = "";
        $changdu = bcdiv(strlen($wenben),$this->jinwei);
        $weizhi = 1;
        $zifu = "";
        
        for ($i=1;$i=$changdu;$i++){
            if ($this->jinwei>1){
                //多进位进制转换
                $zifu = substr($wenben,$i*$this->jinwei-($this->jinwei),$this->jinwei);   
                $jieguo = bcadd(bcmul(bcdiv(strpos($this->mishao,$zifu),$this->jinwei),bcpow($jinzhi,$changdu - $i)),$jieguo);
                }else{
                    //单进位进制转换
                    $zifu = substr($wenben,$i*$this->jinwei-1,$this->jinwei);
                    $jieguo = bcadd(bcmul(strpos($this->mishao,$zifu),bcpow($jinzhi,$changdu - $i)),$jieguo);
                }
        }
        return $jieguo;//完成处理,返回结果。
    }
    function buduan($geshu){//补短
        $zifu = substr($this->mishao,0,$this->jinwei);//取默认为0的字符。
        $jieguo = $zifu;
        for ($i=1;$i=$geshu-1;$i++)
            $jieguo.=$zifu;
   
        return $jieguo;//完成处理,返回结果。
    }
}
$mtime1 = explode(" ", microtime());
$startTime = $mtime1[0] + $mtime1[1];
$mishao = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";//密钥
$jinwei = 1;//进位
$shu = "2147483647";//数据
$jinzhi = 16;//进制
$weishu = 5;//位数,0为自动
$jz = new jinzhi_class;
//$jz->shezhi($mishao,$jinwei);
$jieguo = $jz->jz_xiao($shu,$jinzhi,$weishu);
echo "";
echo "使用说明:
1、转换的数值不能小于0。
2、普通转换最大值不能大于 2147483647。
3、进行进位运算时,最大进制值为,密钥长度除以进位。
当进行1进位的运算时,最大进制值为密钥长度。
4、默认密钥为:0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
echo "";
echo "设置 密钥为:$mishao
";
echo "设置 进位为:$jinwei
";
echo "设置 长度为:$weishu
";
echo "
$shu  转换为 $jinzhi 进制 = $jieguo
";
echo "进位:$jinwei ,实际长度:".strlen($jieguo)."
";
$jinwei = 1;//进位
$shu = "99999999999999999999";//数据
$jinzhi = 32;//进制
$weishu = 0;//位数,0为自动
$jz->shezhi($mishao,$jinwei);
$jieguo = $jz->jz_da($shu,$jinzhi,$weishu);
echo "";
echo "设置 密钥为:$mishao
";
echo "设置 进位为:$jinwei
";
echo "设置 长度为:$weishu
";
echo "
$shu  转换为 $jinzhi 进制 = $jieguo
";
echo "进位:$jinwei ,实际长度:".strlen($jieguo)."";
echo "";
$mtime1 = explode(" ", microtime());
$endTime = $mtime1[0] + $mtime1[1];
printf ("页面执行时间:%.6fs.",$endTime-$startTime);
?>


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/19061/showart_2105037.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP