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 相关文章推荐
基于mysql的论坛(4)
Oct 09 PHP
PHP完整的日历类(CLASS)
Nov 27 PHP
PHP 判断变量类型实现代码
Oct 23 PHP
php 修改zen-cart下单和付款流程以防止漏单
Mar 08 PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
Apr 09 PHP
php使用fputcsv()函数csv文件读写数据的方法
Jan 06 PHP
PHP中isset与array_key_exists的区别实例分析
Jun 02 PHP
CodeIgniter中使用Smarty3基本配置
Jun 29 PHP
php递归函数三种实现方法及如何实现数字累加
Aug 07 PHP
PHP生成各种常见验证码和Ajax验证过程
Jan 10 PHP
PHP入门教程之操作符与控制结构流程详解
Sep 09 PHP
php取出数组单个值的方法
Mar 12 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 异步执行不等待执行结果的处理方法
2015/05/27 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
2016/01/05 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
2016/10/20 PHP
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
浅析JavaScript中两种类型的全局对象/函数
2013/12/05 Javascript
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
Bootstrap整体框架之JavaScript插件架构
2016/12/15 Javascript
利用jquery如何从json中读取数据追加到html中
2017/12/01 jQuery
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
javascript判断一个变量是数组还是对象
2019/04/10 Javascript
基于vue实现图片验证码倒计时60s功能
2019/12/10 Javascript
python求列表交集的方法汇总
2014/11/10 Python
python算法表示概念扫盲教程
2017/04/13 Python
python3.6 tkinter实现屏保小程序
2019/07/30 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
python定时任务 sched模块用法实例
2019/11/04 Python
Selenium向iframe富文本框输入内容过程图解
2020/04/10 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
HTML5探秘:用requestAnimationFrame优化Web动画
2018/06/03 HTML / CSS
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
.NET程序员的几道面试题
2012/06/01 面试题
介绍一下Java的事务处理
2012/12/07 面试题
师范应届生教师求职信
2013/11/05 职场文书
元旦晚会主持词
2014/03/24 职场文书
股份合作协议书
2014/04/12 职场文书
《傅雷家书》教学反思
2014/04/20 职场文书
团代会宣传工作方案
2014/05/08 职场文书
网络舆情信息简报
2015/07/21 职场文书
2016幼儿园教师年度考核评语
2015/12/01 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书
Python爬虫基础之初次使用scrapy爬虫实例
2021/06/26 Python
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript
asyncio异步编程之Task对象详解
2022/03/13 Python