国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php IP轉換整形(ip2long)的詳解

2024-05-04 23:09:29
字體:
來源:轉載
供稿:網友

如何將四個字段以點分開的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;
}
returntrue;
}
//應用
var_export(chk_ip("10.111.149.42"));
var_export(chk_ip("10.111.256.42"));
?>


將輸出true和false

把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函數仍能得到正確的結果.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长兴县| 班玛县| 鹤壁市| 芜湖县| 阳朔县| 松潘县| 云安县| 宁国市| 体育| 渭南市| 正安县| 泽库县| 牙克石市| 小金县| 门源| 牙克石市| 景洪市| 延川县| 梁山县| 洪泽县| 乌拉特中旗| 孟连| 广东省| 兰溪市| 盐亭县| 柳河县| 南华县| 怀化市| 吉木乃县| 长沙县| 习水县| 昭苏县| 永定县| 呼伦贝尔市| 天台县| 永年县| 那坡县| 北宁市| 沂南县| 增城市| 梅州市|