34进制转化为10进制

最近遇到了34进制转化为10进制的问题,记录下。

将34进制的字符串'H2V'转换成为10进制数,进而转换为日期。

百度了下34进制的资料,记录如下:

34进制指以0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、G、H、J、K、L、M、N、P、Q、R、S、T、U、V、W、X、Y、Z为基数做累加。

0-9和A-Z共36个数字加上英文字母去掉 'I'、'O'这两个容易和1、0混淆的字母后共34个基数。主要应用在容易造成数字和字母混淆的特殊领域,比如汽车牌照数字,方便识别管理。

php函数base_convert

function getDate1($str)
{
    $ts_day = 24 * 60 * 60;
    $day_num = intval(base_convert($str, 34, 10));
    return date('Ymd', $day_num * $ts_day);
}

$str = 'H2V';
echo '<pre>';
var_dump($str, getDate1($str)); //"20240129"

得到的结果和实际的日期并不相符,应该是base_convert并未根据实际去除 'I'、'O'这两个字母后再计算

自定义函数

function getDate2($str)
{
    try {
        $base = [
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M',
            'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
        ];

        $sum = 0;
        $len = strlen($str);
        for ($i = 0; $i < $len; $i++) {
            $index = array_search($str[$i], $base);
            if ($index === false) throw new Exception('error');
            $sum += pow(34, $len - $i - 1) * $index;
        }

        $ts_day = 24 * 60 * 60;
        return date('Ymd', $sum * $ts_day);
    } catch (Exception $e) {
        return 0;
    }
}

$str = 'H2V';
echo '<pre>';
var_dump($str, getDate2($str));//"20240127"

得到的结果和实际的日期相符

 

posted @ 2024-01-31 13:27  carol2014  阅读(236)  评论(0编辑  收藏  举报