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 相关文章推荐
我的论坛源代码(一)
Oct 09 PHP
一个捕获函数输出的函数
Feb 14 PHP
php用数组返回无限分类的列表数据的代码
Aug 08 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
Jun 28 PHP
php中Smarty模板初体验
Aug 08 PHP
解析thinkphp中的M()与D()方法的区别
Jun 22 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
Jun 22 PHP
PHP加密解密实例分析
Dec 25 PHP
PHP简单处理表单输入的特殊字符的方法
Feb 03 PHP
PHP中字符与字节的区别及字符串与字节转换示例
Oct 15 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
PHP 数组黑名单/白名单实例代码详解
Jun 04 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备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
php购物车实现方法
2015/01/03 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
2015/01/22 PHP
PHP解决中文乱码
2017/04/28 PHP
详解php框架Yaf路由重写
2017/06/20 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
Convert Seconds To Hours
2007/06/16 Javascript
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
jquery实现弹出层效果实例
2015/05/19 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
jQuery位置选择器用法实例分析
2019/06/28 jQuery
vue实现手机端省市区区域选择
2019/09/27 Javascript
JS实现悬浮球只在一侧滑动并且是横屏状态下
2020/08/19 Javascript
Vue实现省市区三级联动
2020/12/27 Vue.js
python下os模块强大的重命名方法renames详解
2017/03/07 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
python中图像通道分离与合并实例
2020/01/17 Python
python 实现在shell窗口中编写print不向屏幕输出
2020/02/19 Python
在Matplotlib图中插入LaTex公式实例
2020/04/17 Python
Python判断变量是否是None写法代码实例
2020/10/09 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
培训演讲稿范文
2014/01/12 职场文书
温馨提示标语
2014/06/26 职场文书
毕业论文指导老师意见
2015/06/04 职场文书
小学感恩主题班会
2015/08/12 职场文书
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL
Win11开始菜单添加休眠选项
2022/04/19 数码科技