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 02 PHP
一步一步学习PHP(6) 面向对象
Feb 16 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
PHP独立Session数据库存储操作类分享
Jun 11 PHP
php中count获取多维数组长度的方法
Nov 03 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
php车辆违章查询数据示例
Oct 14 PHP
轻松实现php文件上传功能
Feb 17 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
php app支付宝回调(异步通知)详解
Jul 25 PHP
基于Laravel 多个中间件的执行顺序详解
Oct 21 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 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中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
php构造函数与析构函数
2016/04/23 PHP
thinkphp 验证码 的使用小结
2017/05/07 PHP
thinkphp3.2同时连接两个数据库的简单方法
2019/08/13 PHP
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
简介JavaScript中fixed()方法的使用
2015/06/08 Javascript
js实现超简单的展开、折叠目录代码
2015/08/28 Javascript
javascript实现label标签跳出循环操作
2016/03/06 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
2016/03/18 Javascript
使用JQuery 加载页面时调用JS的实现方法
2016/05/30 Javascript
深入浅析jQuery对象$.html
2016/08/22 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
js实现数字递增特效【仿支付宝我的财富】
2017/05/05 Javascript
vue源码解析之事件机制原理
2018/04/21 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
2018/08/10 Javascript
9种方法优化jQuery代码详解
2020/02/04 jQuery
vue2路由方式--嵌套路由实现方法分析
2020/03/06 Javascript
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
VSCode下配置python调试运行环境的方法
2018/04/06 Python
python使用zip将list转为json的方法
2018/12/31 Python
python3.5安装python3-tk详解
2019/04/26 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
2019/08/14 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
Manduka官网:瑜伽垫、瑜伽毛巾和服装
2018/07/02 全球购物
旅游管理专业生自荐信范文
2014/01/02 职场文书
微笑服务演讲稿
2014/05/13 职场文书
道德大讲堂实施方案
2014/05/14 职场文书
爱心捐助倡议书
2014/05/19 职场文书
国庆放假通知怎么写
2015/07/30 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书