/*
*
*最近在工作当中遇到一个IP转换的功能,需要对各种格式ip进行转换求出IP的取值范围,换成aaa.bbb.ccc.ddd的形式
*需要转换的数据格式有:
*(1)192.168.1.0/15
*(2)192.168.1.0/255.255.255.0
*(3)10000300-11000000
*
*在实现功能的时候,用到下面两个方法,分享给大家。(方法来自同事的分享)
*
*/
//该方法是根据IP+网络位数来计算IP的区间范围
//举例数据:192.168.1.0/15
function ip_parse($ip_str){
$mark_len=32;
if(strpos($ip_str,'/')>0){
list($ip_str,$mark_len)=explode("/",$ip_str);
}
$ip=ip2long($ip_str);
$mark=0xFFFFFFFF<<(32-$mark_len)&0xFFFFFFFF;
$ip_start=$ip & $mark;
$ip_end=$ip | (~$mark) & 0xFFFFFFFF;
return array($ip,$mark,$ip_start,$ip_end);
}
list($ip,$mark,$ip_start,$ip_end)=ip_parse('192.168.1.0/15');
echo "IP".long2ip($ip)."\n";
echo "子网掩码".long2ip($mark)."\n";
echo "子网掩码".long2ip($ip_start)."\n";
echo "子网掩码".long2ip($ip_end)."\n";
//该方法是根据IP+子网掩码来计算出Ip的区间范围
//举例数据:192.168.1.0/255.255.255.0
$ip_addr='192.168.1.0';
$subnet_mask='255.255.255.0';
$ip=ip2long($ip_addr);
$nm=ip2long($subnet_mask);
$nw=($ip & $nm);
$bc=$nw | (~$nm);
echo "IP ADDRESS ".long2ip($ip)."\n";
echo "Subnet Mask ".long2ip($nm)."\n";
echo "Network Address ".long2ip($nw)."\n";
echo "Broadcast Address ".long2ip($bc)."\n";
echo "Host Range ".long2ip($nw+1)."-".long2ip($bc-1)."\n";
/*
*php内置的关于IP的转换的函数long2ip()和ip2long()
*/
ip2long(string ip_address) ---将IPv4的地址转换成Int,如果ip地址非法,返回false
long2ip(int proper_address) ---将Int型表示的ip地址表示成aaa.bbb.ccc.ddd的形式
Tips:
使用ip2long()的时候,返回值是Int,所以地址转换成数字后有可能变成负数,此时我们需要换成无符号的Int;
解决办法:sprintf("%u",ip2long($ip_address));
IP格式转换功能代码分享
最新推荐文章于 2024-09-18 14:56:01 发布