PHP的ip2long 是将IP地址转换为数值的函数。
ip2long() 转出来的数值应该都是正整数,但是在某些机器转出负数, 刚开始以为是 PHP 版本问题, 后来做些测试, 确定是系统版本 32bits 和 64bits 的问题。
32 bits ip2long(): -2147483648 ~ 214748364764 64 bits ip2long(): 0 ~ 42949672945
测试代码:
3 list($a, $b, $c, $d) = split(".", $ip);
4 $ip_long = (($a * 256 + $b) * 256 + $c) * 256 + $d;
另外做测试,在return值加上intval(), 如下述:
3 list($a, $b, $c, $d) = split(".", $ip);
4 $ip_long = (($a * 256 + $b) * 256 + $c) * 256 + $d;
5 return intval($ip_long);
intval在32bits/64 bits最大值是不同的,于intval()里面有写到下述:
The maximum value depends on the system. 32 bit systems have a maximum signed integer range of -2147483648 to 2147483647. So for example on such a system, intval("1000000000000") will return 2147483647. The maximum signed integer value for 64 bit systems is 9223372036854775807.
另外做其它测试:
02ip2long("127.255.255.255");
03ip2long("255.255.255.255");
04ip2long("255.255.255.254");
05ip2long("192.168.1.2");
06ip2long() 于 64bits 的系统测试
07ip2long("127.255.255.255");
08ip2long("255.255.255.255");
09ip2long("255.255.255.254");
10ip2long("192.168.1.2");
解法1 - 自己转换
2 list($a, $b, $c, $d) = split(".", $ip);
3 return (($a * 256 + $b) * 256 + $c) * 256 + $d;
解法2 - 转成二进制, 再转回十进制
3echo bindec(decbin(ip2long("192.168.1.2")));
解法3 - 官方建议的解法 (推荐用此方法)
2printf("%u", ip2long("192.168.1.2"));
4echo sprintf("%u", ip2long("192.168.1.2"));
[软件工程网注],关于第一种方法,从数值转换回IP可以使用下面的参考代码:
1function longtoip($num) {
3 $c = (($num-$d)/256)%256;
4 $b = (($num-($c*256)-$d)/(256*256))%256;
5 $a = (($num-($b*256*256)-$c*256-$d)/(256*256*256))%256;
6 return $a.".".$b.".".$c.".".$d; }
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】 进行投诉反馈!