const DECTO_BIN_DATA = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
const BIN_TODEC_DATA = [
'A' => 0,
'B' => 1,
'C' => 2,
'D' => 3,
'E' => 4,
'F' => 5,
'G' => 6,
'H' => 7,
'I' => 8,
'J' => 9,
'K' => 10,
'L' => 11,
'M' => 12,
'N' => 13,
'O' => 14,
'P' => 15,
'Q' => 16,
'R' => 17,
'S' => 18,
'T' => 19,
'U' => 20,
'V' => 21,
'W' => 22,
'X' => 23,
'Y' => 24,
'Z' => 25,
];



/***
* 十进制进制转换 字母 702 (ZZ)
* @param $datalist 需要转换数组
* @param $bin 进制(字母数组转化 26)
* @return array
*/
public static function decto_bin($num, $bin = 26)
{
$num = intval($num);
if ($num === 0) return $num;
$arr = self::DECTO_BIN_DATA;
if ($bin == 10) return $num; //相同进制忽略
$bytelen = ceil(16 / $bin); //获得如果是$bin进制,一个字节的长度
$t = "";
while ($num > 0) {
$t = $arr[$num % $bin] . $t;
$num = floor($num / $bin);
}
$tlen = strlen($t);
if ($tlen % $bytelen != 0) {
$pad_len = $bytelen - $tlen % $bytelen;
$t = str_pad("", $pad_len, "0", STR_PAD_LEFT) . $t; //不足一个字节长度,自动前面补充0
}
return $t;
}

/***
* 字母转换成十进制
* @param $num
* @param int $bin
* @return float|int|mixed
*/
public static function bin_todec($num, $bin = 26)
{
$arr = self::BIN_TODEC_DATA;
if ($bin == 10) return $num; //为10进制不转换
$atnum = str_split($num); //将字符串分割为单个字符数组
$atlen = count($atnum);
$total = 0;
$i = 1;
foreach ($atnum as $tv) {
$tv = strtoupper($tv);
if (array_key_exists($tv, $arr)) {
if ($arr[$tv] == 0) continue;
$total = $total + $arr[$tv] * pow($bin, $atlen - $i);
}
$i++;
}
return $total;
}