大数 进制转换 10-16

原创
2013/05/21 20:58
阅读数 91

10-16

<?php

    function dec2hex($str)
    {
        $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
        $hexval = '';
        $quotient = $str;
        $divisor = $str;
        $flag = true;
        while($flag)
        {
            $len = strlen($divisor);
            $pos = 1;
            $quotient = 0;
            $div = substr($divisor, 0, 2);
            $remainder = $div[0];
            while($pos < $len)
            {
                $div = $remainder == 0 ? $divisor[$pos] : $remainder.$divisor[$pos];
                $remainder = $div % 16;
                $quotient = $quotient.floor($div/16);
                $pos++;
            }
            $quotient = trim_left_zeros($quotient);
            $divisor = "$quotient";
            $hexval = $hex[$remainder].$hexval;
            if (strlen($divisor)<=2)
            {
                if ($divisor<15)
                {
                    $flag = false;
                }
            }
        }
        $hexval = $hex[$quotient].$hexval;
        $hexval = trim_left_zeros($hexval);
        return $hexval;
    }
    function trim_left_zeros($str)
    {
        $str = ltrim($str, '0');
        if (empty($str))
        {
            $str = '0';
        }
        return $str;
    }
    
    $hex = dec2hex('10153302696068');
    if($hex%2!=0) $hex = '0'. $hex;
    $str = str_split($hex,2);
    $out = '';
    for($i=0;$i<count($str);$i++)
    {
      $out = '\x' . $str[$i] . $out;
    }
    $out = $out.'\x00\00';
    echo $out;
    

?>

16-10

<?php
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;
}


$btime = microtime(true);
echo convBase('c4ca4238a0b923820dcc509a6f75849b', '0123456789abcdef', '0123456789');
echo microtime(true) - $btime;
?>



展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部