posts - 17, comments - 4, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          [轉]IP轉換整形(ip2long)

          Posted on 2007-08-24 17:42 愚人 閱讀(4813) 評論(2)  編輯  收藏 所屬分類: PHP
          如何將四個字段以點分開的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函數仍能得到正確的結果.

          轉自http://www.goood.org/2007/01/30/php_ip2long_function/

          評論

          # re: [轉]IP轉換整形(ip2long) ef[未登錄]  回復  更多評論   

          2012-05-08 08:59 by a
          a

          # re: [轉]IP轉換整形(ip2long) [未登錄]  回復  更多評論   

          2012-05-08 09:00 by a
          aa

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 万州区| 青州市| 阜平县| 黄骅市| 台前县| 梅州市| 通渭县| 绥江县| 平塘县| 平阴县| 杭州市| 台东市| 宜宾县| 辽中县| 都兰县| 三明市| 密云县| 全椒县| 陇西县| 突泉县| 永仁县| 宁安市| 边坝县| 保定市| 辰溪县| 华宁县| 印江| 闸北区| 理塘县| 武山县| 延寿县| 文水县| 永嘉县| 珲春市| 象山县| 三江| 丰镇市| 吴旗县| 中山市| 三明市| 鄂托克前旗|