首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php: ip2long返回负值

php: ip2long返回负值
EN

Stack Overflow用户
提问于 2010-06-17 23:00:48
回答 5查看 12.6K关注 0票数 16
代码语言:javascript
复制
function ip_address_to_number($IPaddress) { 
     if(!$IPaddress) {
      return false;
     } else {
      $ips = split('\.',$IPaddress);
      return($ips[3] + $ips[2]*256 + $ips[1]*65536 + $ips[0]*16777216);
     }
}

该函数执行与php捆绑函数ip2long相同的代码。然而,当我打印这两个值时,我得到了两个不同的结果。为什么?(我在wamp环境中使用php 5.2.10 )。

代码语言:javascript
复制
ip2long('200.117.248.17'); //returns **-931792879**

ip_address_to_number('200.117.248.17'); // returns **3363174417**

在这里申请和继续:Showing my country based on my IP, mysql optimized

EN

回答 5

Stack Overflow用户

发布于 2010-06-17 23:06:07

试着这样做:

代码语言:javascript
复制
$ip = sprintf('%u', ip2long($_SERVER['REMOTE_ADDR']));

然后,sprintf将把它写成一个无符号整数。

票数 34
EN

Stack Overflow用户

发布于 2010-06-17 23:12:09

代码语言:javascript
复制
  $ips[3]                             = 17
+ $ips[2] * 256 = 248 * 256           = 63488
+ $ips[1] * 65536 = 117 * 65536       = 7667712
+ $ips[0] * 16777216 = 200 * 16777216 = 3355443200
                                      = 3363174417

PHP最大整数值(32位)为2147483647,小于3363174417

引用自ip2long() PHP手册页面

注意:由于PHP的整数类型是有符号的,并且许多IP地址将产生负整数,因此您需要使用"%u“格式化程序sprintf()或printf()来获取无符号IP地址的字符串表示形式。

票数 6
EN

Stack Overflow用户

发布于 2013-04-08 23:29:29

你可以使用-

代码语言:javascript
复制
// IP Address to Number
function inet_aton($ip)
{
    $ip = trim($ip);
    if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) return 0;
    return sprintf("%u", ip2long($ip));  
}

// Number to IP Address
function inet_ntoa($num)
{
    $num = trim($num);
    if ($num == "0") return "0.0.0.0";
    return long2ip(-(4294967295 - ($num - 1))); 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3062843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档