http请求返回长整型变成负数_详解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

这样结果就不会出问题了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值