phpIP转换整形(ip2long)的详解
转换 详解 整形
2023-06-13 09:15:00 时间
如何将四个字段以点分开的IP网络址协议地址转换成整数呢?PHP里有这么一个函数ip2long.比如
<?php
echoip2long("10.2.1.3");
?>
我们将得到
167903491
这是如何计算的,目前我知道有两个算法。其一
<?php
functionip2int($ip){
//我们先把ip分为四段,$ip1,$ip2,$ip3,$ip4
list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip);
//然后第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256
//这即是我们得到的值
return$ip1*pow(256,3)+$ip2*pow(256,2)+$ip3*256+$ip4;
}
?>
其二,用位运算
<?php
functionip2int($ip){
list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip);
return($ip1<<24)|($ip2<<16)|($ip3<<8)|($ip4);
}
?>
我们会发现,有些ip转化成整数后,是负的,这是因为得到的结果是有符号整型,最大值是2147483647.要把它转化为无符号的,可以用
就能转换为正整数。而且得到的结果用long2ip也可以正常转换回原来的ip地址。也可以用ip2long来验证一个ip是否是有效的,如
<?php
functionchk_ip($ip){
if(ip2long($ip)=="-1"){
returnfalse;
}
returntrue;
}
//应用
var_export(chk_ip("10.111.149.42"));
var_export(chk_ip("10.111.256.42"));
?>
把ip数据保存在数据库(MySQL)中时候,我们习惯用ip2long函数生成整型,然后存放在一个int(11)类型的字段中,但是,在不同的系统平台上,ip2long函数得到的值是不同的,因此可能造成在从数据库中读出数据,用long2ip得到ip的时候产生错误,说一下我们碰到的情况:
我们用一个int(11)类型(范围-2147483648-2147483647)来保存把一个ip地址用ip2long处理得到的结果,例如ip是"202.105.77.179′,那么在32位机器上得到的结果是:-899068493,而在64位机器上却得到3395898803.然后把它写入数据库,由于超过int(11)的范围,因此64位机器上的结果被保存为int(11)的最大值:2147483647.于是在从数据库中取出的时候,便得到了错误的结果,会得到”127.255.255.255″这个ip地址.
解决的办法很多,比如可以用mysql的函数:INET_ATON和INET_NTOA来处理ip地址;或者把保存ip地址的字段改为bigint类型,这样在64位机器上虽然保存的是3395898803,使用long2ip函数仍能得到正确的结果.
相关文章
- Excel与XML相互转换 – C# 简单实现方案[通俗易懂]
- python 进制转换[通俗易懂]
- js把HTML转成对象,将js对象转换为html「建议收藏」
- 进制之间的转换(二进制、八进制、十进制、十六进制)「建议收藏」
- java将字符串转换为json对象的方法_java jsonobject转string
- Groovy closure 与Java function转换
- Word VBA技术:将文档中的超链接转换为普通文本(取消超链接)
- 【CSS3】CSS3 2D 转换 - rotate 旋转 ② ( 使用 rotate 旋转绘制三角形 )
- ora-01830错误:日期格式图片在转换整个输入字符串之前结束详解数据库
- 用JavaScript将数字转换为大写金额详解编程语言
- 将图片转换为base64字符串Java代码详解编程语言
- Date类型与字符串之间的转换详解编程语言
- JavaSE(六)包装类、基本类型和字符串之间的转换、==和equals的区别详解编程语言
- Jackson 框架JSON、XML、List、Map直接相互转换详解编程语言
- java图片与base64字符串之间的转换详解编程语言
- 如何在MSSQL中将日期转换为字符串(mssql日期转换)
- PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明编程语言
- LeetCode 0109 有序链表转换二叉搜索树详解编程语言
- MSSQL将时间格式转换的一种方法(mssql转时间格式)
- 新闻速读 > Facebook 的 TransCoder AI 可在 Java、Python 和 C++ 之间转换代码
- MySQL中使用CASE语句进行条件判断和数据转换的实现方法(mysql中case语句)
- SqlServer2012转换函数的比较(Cast、Convert和Parse)
- 浅析PHP中的字符串编码转换(自动识别原编码)
- c++类的隐式转换与强制转换重载详解
- nodejs中转换URL字符串与查询字符串详解
- CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能