1. 程式人生 > >IP格式轉換功能程式碼分享

IP格式轉換功能程式碼分享

/*
*
*最近在工作當中遇到一個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));