我结结巴巴地回答了以下问题:
“以下代码的输出是什么?”
echo long2ip(ip2long("127.0.255"));正确答案是:"127.0.255.0“。
虽然在php手册中提到了这种行为,甚至在德文手册中也有一个例子,这似乎是合乎逻辑的,但我也有问题要复制它。
我的代码产生以下输出:
echo ip2long("127.0.255"); // outputs: FALSE
echo long2ip(ip2long("127.0.255")); //outputs: 0.0.0.0我在上面测试的机器有以下软件版本:
我的任何同事都不能给我一个准确的解释。我们唯一的假设是,这可能是与苏林补丁的冲突。
如果你有解释,请告诉我。
发布于 2013-05-28 12:12:09
我已经查找了ip2long的PHP源代码。
如果inet_pton可用,则使用inet_pton。否则使用inet_addr。
inet_pton检查,如果ip具有ddd.ddd的格式,则返回0。pton.3.html
如果使用inet_addr,则丢失的ip部分将被0填充。
发布于 2013-05-28 09:29:06
PHP手册还声明(http://de1.php.net/manual/en/function.ip2long.php):
Changelog 版本描述 5.2.10在此版本之前,ip2long()有时会返回一个有效的数字,即使传递的值不是(IPv4) Internet协议虚位地址。
因此,由于您使用的版本比5.2.9更新,它不再工作了。
更新:,但是它可能在某些系统上工作,因为依赖ip2long函数的inet_addr C函数并不是C标准的一部分:每个系统都可能有自己的实现。其中一些实现对于无效的IP地址具有回退模式。你不应该依赖这一点,因为大多数unix衍生产品没有这样的退路。
发布于 2013-05-28 09:29:22
如果您使用ip2long进行IP验证,我建议使用filter_var($ip, FILTER_VALIDATE_IP。
PHP过滤器验证
https://stackoverflow.com/questions/16788425
复制相似问题