PHP MAC地址数字互转

Publish: April 20, 2016 Category: 代码分享 No Comments

数据库中,存储数据千万级别的搜索中,数字类型会比字符串类型快很多,在设计数据库的时候经常页将一些可转换的字段用数字来标示,比如IP和MAC.
PHP中提供了原生的ip地址和数字互转函数即ip2long()long2ip().

int ip2long ( string $ip_address ); 
string long2ip ( string $proper_address ); 

MAC地址和数字的互转, mac是十六进制标示,去掉分隔符之后正好是一个十六进制数,可以直接转换为十进制数,同样十进制数转换成mac时,不够12位的在前面补零.

/**
 * mac合法性校验 兼容大小写和(:-)
 * @param $mac
 * @return bool
 */
function mac_check($mac)
{
    if (empty($mac)) {
        return FALSE;
    }

    $mac_reg = '/^([0-9a-fA-F]{2})((([:][0-9a-fA-F]{2}){5})|(([-][0-9a-fA-F]{2}){5}))$/i';
    return preg_match($mac_reg, $mac)==1?TRUE:FALSE;
}

/**
 * mac 转化为数字表示
 * @param $mac_str
 * @return bool|number
 */
function mac_to_int($mac_str)
{
    if(!mac_check($mac_str)) return FALSE;

    $filter_mac = strtolower(preg_replace('/[:-]/', '', $mac_str));
    $mac_int = hexdec($filter_mac);
    if(is_numeric($mac_int))
        return $mac_int;
    else
        return FALSE;
}

/**
 * 数字转换为标准mac
 * @param $mac_int
 * @param string $chain ('-', ':')
 * @return bool|string
 */
function int_to_mac($mac_int, $chain='-')
{
    $max_value = 281474976710655;
    $min_value = 0;
    if(!is_numeric($mac_int) || $mac_int > $max_value || $mac_int < $min_value) return FALSE;

    $chain_list = array('-', ':');
    if(!in_array($chain, $chain_list)) return FALSE;

    $mac_hex = dechex($mac_int);
    $mac_str = strval($mac_hex);
    $mac_hex_len = strlen($mac_hex);
    if($mac_hex_len < 12)
    {
        $add_len = 12 - $mac_hex_len;
        $add_str = '';
        while ($add_len--)
        {
            $add_str .= '0';
        }
        $mac_str = $add_str . $mac_str;
    }
    $mac_arr = str_split($mac_str, 2);
    $mac_full_str = implode($chain, $mac_arr);


    if(!mac_check($mac_full_str))
        return FALSE;
    else
        return strtoupper($mac_full_str);
}

demo示例:

echo mac_to_int('ac-2d-2a-de-32-1d');
// 输出 189309992710685
echo int_to_mac(189309992710685);
//输出  AC-2D-2A-DE-32-1D

Tags: mac地址数字互转

Related Posts:
  • [尚无相关文章]

Leave a Comment