欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP中IP地址处理

程序员文章站 2022-04-07 13:25:31
...
开发中总会与ip地址打交道,就会常用两个函数.php提供了ip2long与long2ip方法对ip地址处理,今天我们就来详细的研究一下PHP中的ip处理方法,废话就不多说了,让我们一起来看看PHP中ip的地址处理方法吧!

开发中总会与ip地址打交道,就会常用两个函数.php提供了ip2long与long2ip方法对ip地址处理。

ip2long将一个IPV4的字符串互联网协议转换成数字格式

int ip2long ( string $ip_address )
//参数: ip_address 一个标准格式的地址。
//返回值: 返回IP地址转换后的数字 或 FALSE

long2ip将数字格式转换成一个IPV4的字符串互联网协议

string long2ip ( string $proper_address )
//参数: proper_address 长整型的正确地址表示。
//返回值: 返回互联网地址作为字符串。

向数据库存储IP地址时可以使用ip2long函数将ip地址从字符串转换成long型能节省存储空间,取出时再用long2ip 还原IP地址。转换后,对ip地址是否在区间的判断也更加方便 如下:

$a=ip2long('127.0.0.66');
$b=ip2long('127.0.0.111');
$c=ip2long('127.0.0.10');
if($c>=$a && $c <=$b){
echo '呜啦啦';
}else{
echo '啦啦呜';
}

但是需要注意的是!!! 注意 注意 注意

php中将IP转换成整型的函数ip2long()容易出现问题,在IP比较大的情况下,会变成负数。

为啥呐? 答案在此!

IPv4使用无符号32位地址,因此最多有2的32次方减1(4294967295)个地址。书写用4个小数点分开的10进制数。

记为A.B.C.D,例如:192.168.100.100。

IPv4地址每个10进制数都是无符号的字节,范围在0~255,将IPv4地址转为无符号数,其实就是将每个10进制数放在对应的8位上,组成一个4字节的无符号整型。192.168.100.100,192,168在高8位100,100在低8位。


如下

<?php
$ip = "192.168.1.2";
$ip_n = ip2long($ip);
echo $ip_n;      //输出的是个负数 -1062731518
?>

由于IP转换成的整型值太大超出了整型的范围,所以变成负数。

需写成$ip_n = bindec(decbin(ip2long($ip)));这样便可得到无符号的整型数,如下

<?php
$ip = "192.168.1.2";
$ip_n = bindec(decbin(ip2long($ip)));
echo $ip_n;      //得到 3232235778
?>

还有个解决方法:

输出时用%u来格式化为无符号整型。

<?php
$ip = '192.168.101.100';
$ip_long = sprintf('%u',ip2long($ip));
echo $ip_long.PHP_EOL;  // 3232261476 
echo long2ip($ip_long); // 192.168.101.100
?>

相关推荐:

php ip2long 出现负数原因及解决方法

php ip地址转换整数,整数转换地址

php IP获取城市API(纯真IP数据库)

以上就是PHP中IP地址处理的详细内容,更多请关注其它相关文章!

相关标签: php 处理 地址