【问题标题】:Is ip2long() in PHP equal to INET_ATON() function in MySQL?PHP 中的 ip2long() 是否等于 MySQL 中的 INET_ATON() 函数?
【发布时间】:2012-07-18 09:34:02
【问题描述】:

如果我们有如下的ip地址:

127.0.0.1

这两个函数是将ip地址转换为相同的数字,还是它们不同并具有不同的结果?

【问题讨论】:

标签: php mysql


【解决方案1】:

它们几乎完全相同。 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 对此进行了详细描述。

【讨论】:

  • 如果我只给出第一个 oct,这些函数会接受吗?我需要它来转换 GEOLocation 国家。例如 127 从 127.0.0.1 到 int?谢谢。
  • ip2long 要求输入为string containing an (IPv4) Internet Protocol dotted address。虽然 INET_ATON() 不会引发错误,但它可能/可能不会返回正确的值。 127 可以翻译成 127.0.0.0,而不是 127.0.0.1More Info
【解决方案2】:

简而言之,没有,但是这个函数是:

function ipv4touint($ipv4){
    return sprintf('%u',ip2long($ipv4));
}

【讨论】:

  • 我会解释为什么这是一个正确的答案。在接受的答案中提到,在 32 位平台上 ip2long 可以返回负数。 sprintf 的技巧会将负数变成正确的正数。顺便说一句,这是 PHP 手册中推荐的解决方法。
猜你喜欢
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 2014-08-17
相关资源
最近更新 更多