posts - 17, comments - 4, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          [轉(zhuǎn)]IP轉(zhuǎn)換整形(ip2long)

          Posted on 2007-08-24 17:42 愚人 閱讀(4813) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): PHP
          如何將四個(gè)字段以點(diǎn)分開(kāi)的IP網(wǎng)絡(luò)址協(xié)議地址轉(zhuǎn)換成整數(shù)呢?PHP里有這么一個(gè)函數(shù)ip2long.比如 
          <?php 
          echo ip2long("10.2.1.3"); 
          ?> 
          我們將得到 
          167903491 

          這是如何計(jì)算的,目前我知道有兩個(gè)算法。其一 
          <?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; 

          ?> 

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

          ?> 

          我們會(huì)發(fā)現(xiàn),有些ip轉(zhuǎn)化成整數(shù)后,是負(fù)的,這是因?yàn)榈玫降慕Y(jié)果是有符號(hào)整型,最大值是2147483647.要把它轉(zhuǎn)化為無(wú)符號(hào)的,可以用 
          sprintf("%u",ip2long($ip); 

          就能轉(zhuǎn)換為正整數(shù)。而且得到的結(jié)果用long2ip也可以正常轉(zhuǎn)換回原來(lái)的ip地址。也可以用ip2long來(lái)驗(yàn)證一個(gè)ip是否是有效的,如 
          <?php 
          function chk_ip($ip){ 
             if(ip2long($ip)=="-1") { 
                return false; 
             } 
             return true; 

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

          轉(zhuǎn)自http://blog.csdn.net/wztgq/archive/2005/06/28/406662.aspx


          把ip數(shù)據(jù)保存在數(shù)據(jù)庫(kù)(MySQL)中時(shí)候,我們習(xí)慣用ip2long函數(shù)生成整型,然后存放在一個(gè)int(11)類(lèi)型的字段中,但是,在不同的系統(tǒng)平臺(tái)上,ip2long函數(shù)得到的值是不同的,因此可能造成在從數(shù)據(jù)庫(kù)中讀出數(shù)據(jù),用long2ip得到ip的時(shí)候產(chǎn)生錯(cuò)誤,說(shuō)一下我們碰到的情況:
          我們用一個(gè)int(11)類(lèi)型(范圍-2147483648 - 2147483647)來(lái)保存把一個(gè)ip地址用ip2long處理得到的結(jié)果,例如ip是’202.105.77.179′,那么在32位機(jī)器上得到的結(jié)果是:-899068493,而在64位機(jī)器上卻得到3395898803.然后把它寫(xiě)入數(shù)據(jù)庫(kù),由于超過(guò)int(11)的范圍,因此64位機(jī)器上的結(jié)果被保存為int(11)的最大值:2147483647.于是在從數(shù)據(jù)庫(kù)中取出的時(shí)候,便得到了錯(cuò)誤的結(jié)果,會(huì)得到”127.255.255.255″這個(gè)ip地址.
          解決的辦法很多,比如可以用mysql的函數(shù):INET_ATON和INET_NTOA來(lái)處理ip地址;或者把保存ip地址的字段改為bigint類(lèi)型,這樣在64位機(jī)器上雖然保存的是3395898803,使用long2ip函數(shù)仍能得到正確的結(jié)果.

          轉(zhuǎn)自http://www.goood.org/2007/01/30/php_ip2long_function/

          評(píng)論

          # re: [轉(zhuǎn)]IP轉(zhuǎn)換整形(ip2long) ef[未登錄](méi)  回復(fù)  更多評(píng)論   

          2012-05-08 08:59 by a
          a

          # re: [轉(zhuǎn)]IP轉(zhuǎn)換整形(ip2long) [未登錄](méi)  回復(fù)  更多評(píng)論   

          2012-05-08 09:00 by a
          aa

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 吉木萨尔县| 中卫市| 邮箱| 家居| 夏河县| 苗栗县| 札达县| 仪陇县| 朝阳县| 大荔县| 犍为县| 石门县| 红桥区| 镇巴县| 大丰市| 大同市| 洛宁县| 呼伦贝尔市| 琼海市| 和顺县| 兴山县| 富川| 珲春市| 廉江市| 竹北市| 绍兴市| 万载县| 瑞丽市| 彭水| 大埔区| 竹北市| 冀州市| 稷山县| 西盟| 隆林| 岳普湖县| 新平| 合川市| 邹城市| 高淳县| 新晃|