php IP转换整形(ip2long)的详解


Posted in PHP onJune 06, 2013

如何将四个字段以点分开的IP网络址协议地址转换成整数呢?PHP里有这么一个函数ip2long.比如

<?php
echo ip2long("10.2.1.3");
?>

我们将得到
167903491

这是如何计算的,目前我知道有两个算法。其一

<?php
function ip2int($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
function ip2int($ip){
   list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip);
    return($ip1<<24)|($ip2<<16)|($ip3<<8)|($ip4);
}
?>

我们会发现,有些ip转化成整数后,是负的,这是因为得到的结果是有符号整型,最大值是2147483647.要把它转化为无符号的,可以用
sprintf("%u",ip2long($ip);

就能转换为正整数。而且得到的结果用long2ip也可以正常转换回原来的ip地址。也可以用ip2long来验证一个ip是否是有效的,如

<?php
function chk_ip($ip){
   if(ip2long($ip)=="-1") {
      return false;
    }
    returntrue;
}
//应用
var_export(chk_ip("10.111.149.42"));
var_export(chk_ip("10.111.256.42"));
?>

将输出true和false

把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函数仍能得到正确的结果.

PHP 相关文章推荐
PHP 和 HTML
Oct 09 PHP
用PHP和ACCESS写聊天室(八)
Oct 09 PHP
PHP+javascript液晶时钟
Oct 09 PHP
php基础知识:类与对象(5) static
Dec 13 PHP
php事务处理实例详解
Jul 11 PHP
php简单实现查询数据库返回json数据
Apr 16 PHP
7个鲜为人知却非常实用的PHP函数
Jul 01 PHP
smarty的section嵌套循环用法示例
May 28 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
PHP中递归的实现实例详解
Nov 14 PHP
PHP迭代器和迭代的实现与使用方法分析
Apr 19 PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 14 PHP
php全局变量和类配合使用深刻理解
Jun 05 #PHP
php数组声明、遍历、数组全局变量使用小结
Jun 05 #PHP
PHP Global变量定义当前页面的全局变量实现探讨
Jun 05 #PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 #PHP
php将gd生成的图片缓存到memcache的小例子
Jun 05 #PHP
深入理解require与require_once与include以及include_once的区别
Jun 05 #PHP
探讨各种PHP字符串函数的总结分析
Jun 05 #PHP
You might like
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
PHP定时任务延缓执行的实现
2014/10/08 PHP
php实现上传图片文件代码
2015/07/19 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
用js计算页面执行时间的函数
2006/12/07 Javascript
jQuery live( type, fn ) 委派事件实现
2009/10/11 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
2015/09/04 Javascript
基于jQuery实现自动轮播旋转木马特效
2015/11/02 Javascript
JS实现设置ff与ie元素绝对位置的方法
2016/03/08 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
详解tween.js的使用教程
2017/09/14 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
seajs和requirejs模块化简单案例分析
2019/08/26 Javascript
layui 实现自动选择radio单选框(checked)的方法
2019/09/03 Javascript
浅谈Vue中render中的h箭头函数
2019/11/07 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
jquery实现两个div中的元素相互拖动的方法分析
2020/04/05 jQuery
Python装饰器的函数式编程详解
2015/02/27 Python
import的本质解析
2017/10/30 Python
python中判断文件编码的chardet(实例讲解)
2017/12/21 Python
Python使用遗传算法解决最大流问题
2018/01/29 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
Python Django切换MySQL数据库实例详解
2019/07/16 Python
python 实现超级玛丽游戏
2020/11/25 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
Python爬虫教程之利用正则表达式匹配网页内容
2020/12/08 Python
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
澳大利亚和新西兰最大的在线旅行社之一:Aunt Betty
2019/08/07 全球购物
汽修专业学生自我鉴定
2013/11/16 职场文书
办理护照介绍信
2014/01/16 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS
Python os和os.path模块详情
2022/04/02 Python
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/06 PostgreSQL