16进制字符串转36进制字符串

PHP任意进制之间转换数字base_convert
http://php.net/manual/zh/function.base-convert.php

实际测试时因为有精度留失的问题,会导致换错误。
Warning
由于使用内部的 "double" 或 "float" 类型,base_convert() 的操作可能会导致大数值中的精度丢失。请参见本手册的 浮点数 章节以便获得更多详细信息。

$s = 'BE55D904-1F35-4838-8F8F-B27EDEA9DFAB';
$sha1 = sha1($s);
echo $sha1;
echo '<br />';
$sha36 = str_baseconvert($sha1, 16, 36);
echo $sha36;
echo '<br />';
$sha1 = str_baseconvert($sha36, 36, 16);
echo $sha1;
echo '<br />';

function str_baseconvert($str, $frombase=10, $tobase=36) { 
  $str = trim($str); 
  if (intval($frombase) != 10) { 
    $len = strlen($str); 
    $q = 0; 
    for ($i=0; $i<$len; $i++) { 
      $r = base_convert($str[$i], $frombase, 10); 
      $q = bcadd(bcmul($q, $frombase), $r); 
    } 
  } 
  else $q = $str;

  if (intval($tobase) != 10) { 
    $s = ''; 
    while (bccomp($q, '0', 0) > 0) { 
      $r = intval(bcmod($q, $tobase)); 
      $s = base_convert($r, 10, $tobase) . $s; 
      $q = bcdiv($q, $tobase, 0); 
    } 
  } 
  else $s = $q;

  return $s; 
}

 

BC数学函数
http://php.net/manual/zh/ref.bc.php

posted @ 2016-01-08 11:57  Athrun  阅读(1439)  评论(0编辑  收藏  举报