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 服务器配置(使用Apache及IIS两种方法)
Jun 01 PHP
php/js获取客户端mac地址的实现代码
Jul 08 PHP
php警告Creating default object from empty value 问题的解决方法
Apr 02 PHP
PHP中使用imagick实现把PDF转成图片
Jan 26 PHP
PHP curl模拟登录带验证码的网站
Nov 30 PHP
php简单实现数组分页的方法
Apr 30 PHP
php将一维数组转换为每3个连续值组成的二维数组
May 06 PHP
WordPress分页伪静态加html后缀
Jun 08 PHP
php封装的smarty类完整实例
Oct 19 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
Dec 10 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
Apr 21 PHP
PHP如何使用cURL实现Get和Post请求
Jul 11 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/06/14 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
2014/12/01 PHP
php文件读取方法实例分析
2015/06/20 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
javascript静态的url如何传递
2007/05/03 Javascript
关于javascript 回调函数中变量作用域的讨论
2009/09/11 Javascript
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
2011/01/12 Javascript
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
2013/02/26 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
D3.js 从P元素的创建开始(显示可加载数据)
2014/10/30 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
用原生JS对AJAX做简单封装的实例代码
2016/07/13 Javascript
JavaScript实现url参数转成json形式
2016/09/25 Javascript
Vue页面骨架屏的实现方法
2018/05/22 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
vue router 传参获取不到的解决方式
2019/11/13 Javascript
JS removeAttribute()方法实现删除元素的某个属性
2021/01/11 Javascript
Python采用raw_input读取输入值的方法
2014/08/18 Python
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
Python中__new__与__init__方法的区别详解
2015/05/04 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
python中对_init_的理解及实例解析
2019/10/11 Python
Python爬虫爬取杭州24时温度并展示操作示例
2020/03/27 Python
Python如何操作office实现自动化及win32com.client的运用
2020/04/01 Python
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
医学专业毕业生个人的求职信
2013/12/04 职场文书
小学生感恩演讲稿
2014/04/25 职场文书
员工考核评语大全
2014/04/26 职场文书
社区创先争优承诺书
2014/08/30 职场文书
委托证明模板
2014/09/16 职场文书
高中生逃课检讨书
2014/10/10 职场文书
个人工作总结范文2014
2014/11/07 职场文书
Python实战之用tkinter库做一个鼠标模拟点击器
2021/04/27 Python
详解python的异常捕获
2022/03/03 Python