PHP中IP地址处理

来源:互联网 发布:linkin 大数据平台 编辑:程序博客网 时间:2024/05/01 08:45

近期对php基础知识做了一个梳理,将常用的几点总结记录下,当做自己对php的一个系统性的复习吧。

开发中总会与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?>

详细参考链接:http://blog.csdn.net/vfloyd/article/details/7440719

原创粉丝点击