1. 程式人生 > >IP數字和字串的轉換

IP數字和字串的轉換

//將IP轉換為數字
function ipton($ip)
{
   $ip_arr = explode('.', $ip);//分隔ip段
   $ipstr = '';
   foreach ($ip_arr as $value) {
      $iphex = dechex($value);//將每段ip轉換成16進位制
      if (strlen($iphex) < 2) {
         //255的16進製表示是ff,所以每段ip的16進位制長度不會超過2
         $iphex = '0' . $iphex;//如果轉換後的16進位制數長度小於2,在其前面加一個0
         //沒有長度為2,且第一位是0的16進製表示,這是為了在將數字轉換成ip時,好處理
      }
      $ipstr .= $iphex;//將四段IP的16進位制數連線起來,得到一個16進位制字串,長度為8
   }
   return hexdec($ipstr);//將16進位制字串轉換成10進位制,得到ip的數字表示
}


//將數字轉換為IP,進行上面函式的逆向過程
function ntoip($n)
{
   $iphex = dechex($n);//將10進位制數字轉換成16進位制
   $len = strlen($iphex);//得到16進位制字串的長度
   if (strlen($iphex) < 8) {
      $iphex = '0' . $iphex;//如果長度小於8,在最前面加0
      $len = strlen($iphex); //重新得到16進位制字串的長度
   }
   //這是因為ipton函式得到的16進位制字串,如果第一位為0,在轉換成數字後,是不會顯示的
   //所以,如果長度小於8,肯定要把第一位的0加上去
   //為什麼一定是第一位的0呢,因為在ipton函式中,後面各段加的'0'都在中間,轉換成數字後,不會消失
   for ($i = 0, $j = 0; $j < $len; $i = $i + 1, $j = $j + 2) {
      //迴圈擷取16進位制字串,每次擷取2個長度
      $ippart = substr($iphex, $j, 2);//得到每段IP所對應的16進位制數
      $fipart = substr($ippart, 0, 1);//擷取16進位制數的第一位
      if ($fipart == '0') {
         //如果第一位為0,說明原數只有1位
         $ippart = substr($ippart, 1, 1);//將0擷取掉
      }
      $ip[] = hexdec($ippart);//將每段16進位制數轉換成對應的10進位制數,即IP各段的值
   }
   //$ip = array_reverse($ip);

   return implode('.', $ip);//連線各段,返回原IP值
}