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中创建并处理图象
Oct 09 PHP
php class中self,parent,this的区别以及实例介绍
Apr 24 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
May 06 PHP
php不使用插件导出excel的简单方法
Mar 04 PHP
php中count获取多维数组长度的方法
Nov 03 PHP
微信公众平台开发关注及取消关注事件的方法
Dec 23 PHP
php使用curl并发减少后端访问时间的方法分析
May 12 PHP
PHP数据的提交与过滤基本操作实例详解
Nov 11 PHP
php多文件打包下载的实例代码
Jul 12 PHP
浅谈Laravel中的一个后期静态绑定
Aug 11 PHP
浅谈PHP无限极分类原理
Mar 14 PHP
PHP反射学习入门示例
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
php 静态变量的初始化
2009/11/15 PHP
php zip文件解压类代码
2009/12/02 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
2014/04/08 PHP
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
2013/11/17 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
使用js操作css实现js改变背景图片示例
2014/03/10 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
2016/02/21 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
D3.js实现散点图和气泡图的方法详解
2016/09/21 Javascript
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
详解使用React全家桶搭建一个后台管理系统
2017/11/04 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
python 从远程服务器下载东西的代码
2013/02/10 Python
python 实现视频流下载保存MP4的方法
2019/01/09 Python
详解python和matlab的优势与区别
2019/06/28 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
浅谈keras保存模型中的save()和save_weights()区别
2020/05/21 Python
Python中免验证跳转到内容页的实例代码
2020/10/23 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
解析HTML5中的新功能本地存储localStorage
2016/03/01 HTML / CSS
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
少先队学雷锋活动总结范文
2014/03/09 职场文书
地球一小时倡议书
2014/04/15 职场文书
市场营销专业应届生自荐信
2014/06/19 职场文书
综合素质自我评价怎么写
2014/09/14 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
升学宴答谢词
2015/01/05 职场文书
TV动画《八十龟酱观察日记》第四季宣传PV公布
2022/04/06 日漫
CSS使用Flex和Grid布局实现3D骰子
2022/08/05 HTML / CSS