IP數字和字串的轉換
阿新 • • 發佈:2018-12-15
//將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值 }