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静态新闻列表自动生成代码
Jun 14 PHP
php Memcache 中实现消息队列
Nov 24 PHP
Godaddy空间Zend Optimizer升级方法
May 10 PHP
header中Content-Disposition的作用与使用方法
Jun 13 PHP
PHP中如何定义和使用常量
Feb 28 PHP
PHP json_decode函数详细解析
Feb 17 PHP
PHP入门之常量简介和系统常量
May 12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
Jun 23 PHP
linux下安装php的memcached客户端
Aug 03 PHP
PHP中require和include路径问题详解
Dec 25 PHP
Zend Framework教程之模型Model基本规则和使用方法
Mar 04 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 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
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
提高PHP编程效率的方法
2013/11/07 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
TextArea 控件的最大长度问题(js json)
2009/12/16 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
2013/12/22 Javascript
jquery 插件实现多行文本框[textarea]自动高度
2015/03/04 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
JS实现自动阅读单词(有道单词本添加功能)
2016/11/14 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
javascript修改浏览器title方法 JS动态修改浏览器标题
2017/11/30 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
浅谈js中的bind
2019/03/18 Javascript
vue视图不更新情况详解
2019/05/16 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
Python实现PyPDF2处理PDF文件的方法示例
2019/09/25 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
哥伦比亚最大的网上商店:Linio哥伦比亚
2016/09/25 全球购物
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
高中的自我鉴定
2013/12/16 职场文书
家长评语大全
2014/01/22 职场文书
幼儿教师培训感言
2014/03/08 职场文书
降消项目实施方案
2014/03/30 职场文书
优秀毕业生求职信
2014/06/05 职场文书
小学校园广播稿
2015/08/18 职场文书