IP轉換整形(ip2long)

如何將四個字段以點分開的IP網絡址協議地址轉換成整數呢?PHP裏有這麼一個函數ip2long.好比 
<?php 
echo ip2long("10.2.1.3"); 
?> 
咱們將獲得 
167903491 

這是如何計算的,目前我知道有兩個算法。其一 
<?php 
function ip2int($ip){ 
   //咱們先把ip分爲四段,$ip1,$ip2,$ip3,$ip4 
   list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip); 
   //而後第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256 
   //這便是咱們獲得的值 
   return $ip1*pow(256,3)+$ip2*pow(256,2)+$ip3*256+$ip4; 

?> 

其二,用位運算 
<?php 
function ip2int($ip){ 
   list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip); 
   return ($ip1<<24)|($ip2<<16)|($ip3<<8)|($ip4); 

?> 

咱們會發現,有些ip轉化成整數後,是負的,這是由於獲得的結果是有符號整型,最大值是2147483647.要把它轉化爲無符號的,能夠用 
sprintf("%u",ip2long($ip); 

就能轉換爲正整數。並且獲得的結果用long2ip也能夠正常轉換回原來的ip地址。也能夠用ip2long來驗證一個ip是不是有效的,如 
<?php 
function chk_ip($ip){ 
   if(ip2long($ip)=="-1") { 
      return false; 
   } 
   return true; 

//應用 
var_export(chk_ip("10.111.149.42")); 
var_export(chk_ip("10.111.256.42")); 
?> 
將輸出true和false 

轉自http://blog.csdn.net/wztgq/archive/2005/06/28/406662.aspx 把ip數據保存在數據庫(MySQL)中時候,咱們習慣用ip2long函數生成整型,而後存放在一個int(11)類型的字段中,可是,在不一樣的系統平臺上,ip2long函數獲得的值是不一樣的,所以可能形成在從數據庫中讀出數據,用long2ip獲得ip的時候產生錯誤,說一下咱們碰到的狀況: 咱們用一個int(11)類型(範圍-2147483648 - 2147483647)來保存把一個ip地址用ip2long處理獲得的結果,例如ip是’202.105.77.179′,那麼在32位機器上獲得的結果是:-899068493,而在64位機器上卻獲得3395898803.而後把它寫入數據庫,因爲超過int(11)的範圍,所以64位機器上的結果被保存爲int(11)的最大值:2147483647.因而在從數據庫中取出的時候,便獲得了錯誤的結果,會獲得」127.255.255.255″這個ip地址. 解決的辦法不少,好比能夠用mysql的函數:INET_ATON和INET_NTOA來處理ip地址;或者把保存ip地址的字段改成bigint類型,這樣在64位機器上雖然保存的是3395898803,使用long2ip函數仍能獲得正確的結果.
相關文章
相關標籤/搜索