今天就跟大家聊聊有關(guān)PHP中的IP轉(zhuǎn)換整形怎么利用ip2long實現(xiàn),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
如何將四個字段以點分開的IP網(wǎng)絡(luò)址協(xié)議地址轉(zhuǎn)換成整數(shù)呢?PHP里有這么一個函數(shù)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); } ?>
我們會發(fā)現(xiàn),有些ip轉(zhuǎn)化成整數(shù)后,是負的,這是因為得到的結(jié)果是有符號整型,較大值是2147483647.要把它轉(zhuǎn)化為無符號的,可以用
sprintf("%u",ip2long($ip);
就能轉(zhuǎn)換為正整數(shù)。而且得到的結(jié)果用long2ip也可以正常轉(zhuǎn)換回原來的ip地址。也可以用ip2long來驗證一個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
把ip數(shù)據(jù)保存在數(shù)據(jù)庫(MySQL)中時候,我們習(xí)慣用ip2long函數(shù)生成整型,然后存放在一個int(11)類型的字段中,但是,在不同的系統(tǒng)平臺上,ip2long函數(shù)得到的值是不同的,因此可能造成在從數(shù)據(jù)庫中讀出數(shù)據(jù),用long2ip得到ip的時候產(chǎn)生錯誤,說一下我們碰到的情況:
我們用一個int(11)類型(范圍-2147483648 - 2147483647)來保存把一個ip地址用ip2long處理得到的結(jié)果,例如ip是'202.105.77.179′,那么在32位機器上得到的結(jié)果是:-899068493,而在64位機器上卻得到3395898803.然后把它寫入數(shù)據(jù)庫,由于超過int(11)的范圍,因此64位機器上的結(jié)果被保存為int(11)的較大值:2147483647.于是在從數(shù)據(jù)庫中取出的時候,便得到了錯誤的結(jié)果,會得到”127.255.255.255″這個ip地址.
解決的辦法很多,比如可以用mysql的函數(shù):INET_ATON和INET_NTOA來處理ip地址;或者把保存ip地址的字段改為bigint類型,這樣在64位機器上雖然保存的是3395898803,使用long2ip函數(shù)仍能得到正確的結(jié)果.
看完上述內(nèi)容,你們對PHP中的IP轉(zhuǎn)換整形怎么利用ip2long實現(xiàn)有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
當(dāng)前文章:PHP中的IP轉(zhuǎn)換整形怎么利用ip2long實現(xiàn)-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://www.rwnh.cn/article30/joppo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、網(wǎng)站導(dǎo)航、網(wǎng)站建設(shè)、云服務(wù)器、域名注冊、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)