【发布时间】:2012-07-18 09:34:02
【问题描述】:
如果我们有如下的ip地址:
127.0.0.1
这两个函数是将ip地址转换为相同的数字,还是它们不同并具有不同的结果?
【问题讨论】:
如果我们有如下的ip地址:
127.0.0.1
这两个函数是将ip地址转换为相同的数字,还是它们不同并具有不同的结果?
【问题讨论】:
它们几乎完全相同。 ip2long 有时会返回负值,因为 PHP 使用有符号数进行估值,而 MySQL 使用无符号数。
两者都被评估为x*(2^24) + y*(2^16) + z*(2^8) + w*(2^0),但在 PHP 中,由于签名时间较长,某些 IP 地址会显示负值。
For signed long, the range is
(2^31) - 1 = −2,147,483,648 to +2,147,483,647
因此,地址转换为 +2,147,483,647 时会回绕并给出负值。
ip2long("254.254.254.254"); // -16843010
link 对此进行了详细描述。
【讨论】:
string containing an (IPv4) Internet Protocol dotted address。虽然 INET_ATON() 不会引发错误,但它可能/可能不会返回正确的值。 127 可以翻译成 127.0.0.0,而不是 127.0.0.1。 More Info
简而言之,没有,但是这个函数是:
function ipv4touint($ipv4){
return sprintf('%u',ip2long($ipv4));
}
【讨论】:
ip2long 可以返回负数。 sprintf 的技巧会将负数变成正确的正数。顺便说一句,这是 PHP 手册中推荐的解决方法。