IP地址和转整型相关问题整理

IP地址和整型互转,常见的自然是用php自带的系统函数ip2long与long2ip

然,ip地址转整型的时候却存在几个问题需要注意:

1.ip的组成字符串中,若是某段出现填充0的情况,结果就会出现错误。代码如下

$ip = '192.168.01.115';
var_dump($ip); echo "<br/>";
        
$intip = ip2long($ip); 
var_dump($intip); echo "<br/>";
        
$ip = long2ip($intip);
var_dump($ip);

输出结果如下:

string '192.168.01.115' (length=14)

boolean false

string '0.0.0.0' (length=7)

2.ip转整型也会出现有符号的结果,需要注意处理。代码如下

$ip = '192.168.1.115';
var_dump($ip); echo "<br/>";
        
$intip = ip2long($ip); 
var_dump($intip); echo "<br/>";
        
$ip = long2ip($intip);
var_dump($ip);

输出结果如下:

string '192.168.1.115' (length=13)

int -1062731405

string '192.168.1.115' (length=13)

如此分析,第一步是将ip字符串分解并对每段进行验证和处理,检测ip地址的合法性,重新格式化去除填充零部分;第二步,格式化输出为无符号整型;实现代码如下:

<?php

// 检查IP地址是否合法
function check_ip($ip)
{
    $iparr = explode('.',$ip);
    foreach($iparr as $v){ if($v>255) return false; }
    return true;
}

// IP地址转换无符号整型
function ip2Plus ($ip)
{
    $iparr = explode('.',$ip);
    // 去除填充零和非数字的值
    $result_ip = [];
    foreach ($iparr as $val){
        if(is_numeric($val)){       
            $result_ip[] = intval($val);    
        }
    }
    $result_ip = implode(".", $result_ip);
    
    if(check_ip($result_ip)){       //检查IP地址是否合法
        return sprintf("%u\n",ip2long($result_ip)); //格式化输出无符号整型
    }
    return false;
}

// 调用方法
$ip = '192.168.01.115';
var_dump($ip); echo "<br/>";
        
$intip = ip2Plus($ip); 
var_dump($intip); echo "<br/>";
        
$ip = long2ip($intip);
var_dump($ip);

结果如下:

string '192.168.01.115' (length=14)

string '3232235891' (length=11)    

string '192.168.1.115' (length=13)

注意:ip地址转无符号整型时,返回值的长度有可能会超出整型的限值,即整数溢出问题。此时,万不可用int()方法转为整型,否则会出错。示例如下:

$ip = '192.168.01.115';
var_dump($ip); echo "<br/>";
        
$intip = intval(ip2Plus($ip)); 
var_dump($intip); echo "<br/>";
        
$ip = long2ip($intip);
var_dump($ip);

结果如下:

string '192.168.01.115' (length=14)

int 2147483647    //此处整数溢出,去整型最大值

string '127.255.255.255' (length=15)    //返回的ip地址自然是错的



参考文章:

http://www.jb51.net/article/54012.htm

https://my.oschina.net/goal/blog/198049

http://cn2.php.net/manual/zh/language.types.integer.php






版权声明:本文为u012717614原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。