当前位置: 首页 > 工具软件 > BaseX > 使用案例 >

base php,php-baseX

丰胤运
2023-12-01

/**

* Created by PhpStorm.

* User: xiongchao

* Date: 2018/7/9

* Time: 14:18

*/

/*

* 思路和普通的十进制转任意进制相同,假设将M进制转N进制,则基本思路为:M/N的余数的N进制表示作为结果的第一位,商的M进制表示作为下一论循环的输入。直到M为0为止。

*/

class BaseX{

/**

* @param string $num

* @param int $m

* @param int $n

* @return string

*/

public function baseConvert(string $num, int $m, int $n)

{

$result = '';

$shang = $num;

while (strlen($shang) > 0) {

$result .= $this->qiuyu($shang, $m, $n);

}

return strrev($result);

}

private function qiuyu(string &$num, int $m, int $n)

{

$remain = 0;

$shang = '';

for ($i = 0; $i < strlen($num); $i++) {

$remain = $remain * $m + $this->getIntFromStr($num[$i]);

$shang .= $this->getStrFromInt(intval($remain / $n));

$remain = $remain % $n;

}

while (strlen($shang) > 0 && $shang[0] == '0') {

$shang = substr($shang, 1);

}

$num = $shang;

return $this->getStrFromInt($remain);

}

private function getIntFromStr($value)

{

if ($value >= '0' && $value <= '9')

return $value - 0;

if ($value >= 'a' && $value <= 'z')

return (ord($value) - ord('a')) + 10;

}

private function getStrFromInt(int $value)

{

if ($value >= 0 && $value <= 9)

return (string)$value;

if ($value >= 10 && $value <= 35)

return chr(97 + ($value - 10));

else

throw new Exception("output $value");

}

/**

* 依赖gmp扩展,该方法性能较好

* @param string $num

* @param $base

* @param $toBase

* @return string

*/

public function gmp_convert(string $num,$base,$toBase){

return gmp_strval(gmp_init($num,$base),$toBase);

}

}

 类似资料: