ip2long在32位系统下“溢出”问题

PHP ip2long的算法是
A*256*256*256+B*256*256+C*256+D
这个和mysql的INET_ATON算法是一样的。如果你把10.0.0.1使用ip2long计算,得到的结果是167772161,如果你把这个整数存到数据库里面(mysql存储这个值是字段需要用int UNSIGNED。否则,128以上的IP段就存储不了了。),你可以这样取得这个结果集SELECT INET_ATON('10.0.0.1')。
ip2long计算的结果可以使用long2ip来进行逆运算。唯一的一个小问题是,在32位系统上,高位IP计算出来的long会超长“溢出”, 输出一个负数。不过不影响long2ip进行逆运算。不过在判断IP区间的话,可能引起麻烦。解决办法 就是看是否是负数,如果是负数,使用sprintf格式化输出或者bindec再decbin
[php]# phpsh
Starting php
type 'h' or 'help' to see instructions & features
php> echo ip2long('192.168.1.38')
-1062731482
php> echo long2ip(ip2long('192.168.1.38')-1)
192.168.1.37
php> echo long2ip(ip2long('192.168.1.38')-39)
192.168.0.255
php> echo ip2long('10.0.0.1')
167772161
php>

php> echo sprintf("%u",ip2long('192.168.1.38'))
3232235814
php> echo long2ip(sprintf("%u",ip2long('192.168.1.38')))
192.168.1.38
php> echo long2ip('3232235814')
192.168.1.38
php> echo long2ip('-1062731482')
192.168.1.38
php> echo decbin(ip2long('192.168.1.38'))
11000000101010000000000100100110
php> echo bindec(decbin(ip2long('192.168.1.38')))
3232235814
php> echo bindec(decbin(ip2long('10.0.0.1')))
167772161
php> echo sprintf("%u",ip2long('10.0.0.1'))
167772161
php>
[/php]

Author Info :
  • From:ip2long在32位系统下“溢出”问题
  • URL:https://blog.ihipop.com/2012/02/2998.html
  • Please Reserve This Link,Thanks!
  • 《ip2long在32位系统下“溢出”问题》上有3条评论

    发表回复

    您的电子邮箱地址不会被公开。 必填项已用 * 标注