详解ip2long,long2ip以及转换整型出现负数的解决办法

在开发中,经常需要将IP地址转成整型进行保存,这样不仅有利于做索引,并且原本需要15个字节的存储空间,

转换后只需4个字节就能存储了。不过由于ip2long只支持IPv4,所以本文也是基于IPv4来讲解的

1,使用php的内置函数ip2long()

$ip = '192.0.34.166';

echo ip2long($ip);

得到的结果 -1073732954

原因是ip2long转换的函数是有符号的,最大值为2147483647

一旦超过,就会成为负值,解决办法后面会有


2,自己写函数来转换

function ip2int($ip){
   //把ip分为四段,$ip1,$ip2,$ip3,$ip4
   list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip);
   //然后第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256,pow是指数表达式
    return $ip1*pow(256,3)+$ip2*pow(256,2)+$ip3*256+$ip4;
}

echo ip2int($ip);(两种函数得到的结果一样)

得到的结果 3221234342;

这种是可以避免出现负数的方法之一,但是使用函数略显麻烦


然后我们用long2ip来转换到刚刚转换后得到的数据值

$ip1 = long2ip(ip2long($ip));//使用内置函数ip2long

echo $ipint;//192.0.34.166

$ip2 = ip2int($ip);//使用上面自定义的函数

echo $ipint;//192.0.34.166

得到的结果是一样的,虽然结果是一样的,但是我们需要把转换成整型后的地址存到数据库中,

负值并不友好,所以需要改进,


改进方法

$ipint = sprintf('%u',ip2long($ip));//%u格式化为无符号的十进制数

echo $ipint;//3221234342

这样结果就不会出问题了








你可能感兴趣的:(ip2long,long2ip,IP地址转换)