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

首頁 > 開發(fā) > PHP > 正文

PHP IP地址與整型互相轉(zhuǎn)換詳解

2024-05-04 21:57:00
字體:
供稿:網(wǎng)友

昨天要判斷用戶IP來源,然后再輸入用戶IP所在網(wǎng)段所在地址,我們第一條就需要把IP地址與整型互相轉(zhuǎn)換功能實現(xiàn),下面我來看看.

系統(tǒng)函數(shù)ip2long與long2ip

PHP中有內(nèi)置函數(shù)ip2long可以將ip地址轉(zhuǎn)換整型,代碼如下:

$ip = '210.110.11.49';echo ip2long($ip);

輸出:-764540111,輸出的整型有負號是因為我們得到的結(jié)果是有符號整型,有符號整型最大值2147483647,要把結(jié)果轉(zhuǎn)換為無符號型可以這么寫 3530427185

使用long2ip把整型轉(zhuǎn)換回ip地址,代碼如下:

  1. $ip = '210.110.11.49'
  2. $ip_int = ip2long($ip); 
  3. echo $ip."<br />"
  4. echo $ip_int."<br />"
  5. echo long2ip($ip_int); 

輸出:210.110.11.49,-764540111,210.110.11.49

從結(jié)果可以看到,ip與整型可以通過函數(shù)完成。

系統(tǒng)函數(shù)小bug:這中bug網(wǎng)上一搜都是,大意說的是ip某段加個前導(dǎo)0,先來看看這個bug實例,代碼如下:

  1. $ip = '210.110.011.49'
  2. $ip_int = ip2long($ip); 
  3. echo $ip."<br />"
  4. echo $ip_int."<br />"
  5. echo long2ip($ip_int); 
  6. //輸出: 
  7. //210.110.011.49 
  8. //-764540623 
  9. //210.110.9.49 

轉(zhuǎn)換結(jié)果不匹配,我們試著在ip第一段數(shù)字前加前導(dǎo)0,再看看如下代碼:

  1. $ip = '021.110.11.49'
  2. $ip_int = ip2long($ip); 
  3. echo $ip."<br />"
  4. echo $ip_int."<br />"
  5. echo long2ip($ip_int); 
  6. //輸出: 
  7. //021.110.11.49 
  8. //292424497 
  9. //17.110.11.49 

轉(zhuǎn)換結(jié)果都出錯,以上例子都是因為加了前導(dǎo)0后導(dǎo)致轉(zhuǎn)換結(jié)果出錯,連帶逆轉(zhuǎn)結(jié)果與原轉(zhuǎn)換ip不匹配.

轉(zhuǎn)換原理,目前有兩個算法:

第一、第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256、最后總和,代碼如下:

  1. $ip = '0210.110.11.49'
  2. function ipToInt($ip){ 
  3. $iparr = explode('.',$ip); 
  4. $num = 0; 
  5. for($i=0;$i<count($iparr);$i++){ 
  6. $num += intval($iparr[$i]) * pow(256,count($iparr)-($i+1)); 
  7. return $num
  8. echo $ip.'<br />'
  9. $ip_int = ipToInt($ip); 
  10. echo $ip_int.'<br />'
  11. echo long2ip($ip_int); 
  12. //輸出: 
  13. //0210.110.11.49 
  14. //3530427185 
  15. //210.110.11.49 

第二、通過位運算符,代碼如下:

  1. $ip = '0210.110.11.49'
  2. function ipToInt($ip){ 
  3. $iparr = explode('.',$ip); 
  4. return (intval($iparr[0]<<24))|(intval($iparr[1])<<16)|(intval($iparr[2])<<8)| (intval($iparr[3])); 
  5. echo $ip.'<br />'
  6. $ip_int = ipToInt($ip); 
  7. echo $ip_int.'<br />'
  8. echo long2ip($ip_int); 
  9. //輸出: 
  10. //0210.110.11.49 
  11. //-764540111 
  12. //210.110.11.49 

檢測IP是否合法

第一、自己遍歷檢測,代碼如下:

  1. function check_ip($ip){ 
  2. $iparr = explode('.',$ip); 
  3. foreach($iparr as $v){ if($v>255) return false; } 
  4. return true; 
  5. echo '210.285.11.49,'
  6. var_dump(check_ip('210.285.11.49')); 
  7. echo '<br />'
  8. echo '210.205.11.49,'
  9. var_dump(check_ip('210.205.11.49')); 
  10. //輸出: 
  11. //210.285.11.49,bool(false) 
  12. //210.205.11.49,bool(true) 

第二、使用ip2long返回,代碼如下:

  1. function check_ip($ip){ 
  2. if(ip2long($ip)) return true; 
  3. return false; 
  4. echo '210.285.11.49,'
  5. var_dump(check_ip('210.285.11.49')); 
  6. echo '<br />'
  7. echo '210.205.11.49,'
  8. var_dump(check_ip('210.205.11.49')); 
  9. //輸出: 
  10. //210.285.11.49,bool(false) 
  11. //210.205.11.49,bool(true)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 登封市| 长兴县| 都江堰市| 威海市| 金华市| 东乌| 孝感市| 思茅市| 麻城市| 虎林市| 锦屏县| 平山县| 应城市| 大新县| 拉萨市| 绩溪县| 福州市| 托克逊县| 承德县| 庆元县| 溧阳市| 武平县| 连南| 天全县| 德化县| 奉节县| 蓬莱市| 太仆寺旗| 城口县| 吴堡县| 苏州市| 九寨沟县| 临洮县| 定州市| 平泉县| 米脂县| 临湘市| 开化县| 哈密市| 郯城县| 吴川市|