详解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

这样结果就不会出问题了

时间: 2024-08-24 15:45:02

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

【Git使用详解】Egit使用过程中遇到的问题及解决办法

1.   Git错误non-fast-forward后的冲突解决 问题(Non-fast-forward)的出现原因在于:git仓库中已经有一部分代码,所以它不允许你直接把你的代码覆盖上去.于是你有2个选择方式: 1.强推,即利用强覆盖方式用你本地的代码替代git仓库内的内容 git push –f 如果你用的是Egit则可以在推送界面选择"Force Update All Specs"即可,如下图: 2.先把git的东西fetch到你本地然后merge后再push $ git fet

详解get请求和post请求参数中文乱码的解决办法

首先出现中文乱码的原因是tomcat默认的编码方式是"ISO-8859-1",这种编码方式以单个字节作为一个字符,而汉字是以两个字节表示一个字符的. 一,get请求参数中文乱码的解决办法 对于get请求解决中文乱码有两种途径一种是修改tomcat默认的编码方式为"UTF-8" 在tomcat的server.xml里把 <Connector connectionTimeout="50000" port="8080" pro

【转】浮点型转换整型的快速方法介绍

原文网址:http://blog.csdn.net/leakers_zzw/article/details/8005762 [注明] 现有的Intel中的SSE指令 cvtps2dq XMM,XMM/m128 支持把源存储器4个单精度浮点数变成4个双字有符号整数,结果送入目的寄存器,内存变量必须对齐内存16字节,另外还有其他指令支持双精度和整型的转换. 转载本文,作为C算法设计的探讨. 在计算机图形运算中,常常要将浮点数转换为整数,例如在图像的光栅化阶段,就要执行大量的类型转换,以便将浮点数表示

iOS疯狂详解之录制音频转换成Mp3

使用第三方 lame ,Mp3音频编码器. 使用 AVAudioRecorder 进行音频录制之前,进行参数设置: NSString *recordTemporaryPathString = [NSString stringWithFormat:@"%@/temporary",self.audioTemporarySavePath]; //LinearPCM 是iOS的一种无损编码格式,但是体积较为庞大 //录音设置 NSMutableDictionary *recordSetting

在linux系统下安装mysql详解,以及远程调用连接不上mysql的解决方法。

步骤: 1)查看CentOS自带的mysql 输入 rpm -qa | grep mysql 2)将自带的mysql卸载 3)上传Mysql的安装包到linux 4)安装mysql的依赖(不是必须) yum -y install libaio.so.1 libgcc_s.so.1 libstdc++.so.6 yum  update libstdc++-4.4.7-4.el6.x86_64 5)解压Mysql到/usr/local/下的mysql目录(mysql目录需要手动创建)内 cd /us

Java开发中的23种设计模式详解之三:11种行为型模式

本章是关于设计模式的最后一讲,会讲到第三种设计模式--行为型模式,共11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式.这段时间一直在写关于设计模式的东西,终于写到一半了,写博文是个很费时间的东西,因为我得为读者负责,不论是图还是代码还是表述,都希望能尽量写清楚,以便读者理解,我想不论是我还是读者,都希望看到高质量的博文出来,从我本人出发,我会一直坚持下去,不断更新,源源动力来自于读者朋友们的不断支持,我会尽自己

Spark函数详解系列--RDD基本转换

摘要:   RDD:弹性分布式数据集,是一种特殊集合 ‚ 支持多种来源 ‚ 有容错机制 ‚ 可以被缓存 ‚ 支持并行操作,一个RDD代表一个分区里的数据集   RDD有两种操作算子:          Transformation(转换):Transformation属于延迟计算,当一个RDD转换成另一个RDD时并没有立即进行转换,仅仅是记住了数据集的逻辑操作          Ation(执行):触发Spark作业的运行,真正触发转换算子的计算 本系列主要讲解Spark中常用的函数操作:  

Java开发中的23种设计模式详解之一:5种创建型模式

一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 其实还有两类:并发型模式和线程池模式.用一个图片来整体描述一下: 二.设计模式的六大原则 1.开闭原则(Open Clo

Delphi float浮点值转换整型int 方法

Uses Math; var ff:Extended; begin ff:=5.16; ShowMessage(IntToStr(Trunc(aa))); //截取整数,小数不要 ShowMessage(IntToStr(Floor(aa))); //往小取整 ShowMessage(IntToStr(Ceil(aa))); //往大取整 ShowMessage(IntToStr(Round(aa))); //四舍五入取整 end; 其他 Delphi数学函数 参考:https://www.cn