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模板,主要想体现一下思路
Dec 25 PHP
PHP 全角转半角实现代码
May 16 PHP
用PHP实现小写金额转换大写金额的代码(精确到分)
Jan 10 PHP
php $_SERVER windows系统与linux系统下的区别说明
Feb 14 PHP
php+mysql实现的二级联动菜单效果详解
May 10 PHP
PHP判断JSON对象是否存在的方法(推荐)
Jul 06 PHP
PHP运行模式汇总
Nov 06 PHP
Thinkphp5结合layer弹窗定制操作结果页面
Jul 07 PHP
PHP生成推广海报的方法分享
Apr 22 PHP
Laravel框架控制器,视图及模型操作图文详解
Dec 04 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 21 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
Feb 27 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
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
php 保留字列表
2012/10/04 PHP
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
php实现上传图片文件代码
2015/07/19 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
javascript web对话框与弹出窗口
2009/02/22 Javascript
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
2015/09/21 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
javascript运算符语法全面概述
2016/07/14 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
Vue-cli@3.0 插件系统简析
2018/09/05 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
Vue实现验证码功能
2019/12/03 Javascript
Python实现网站文件的全备份和差异备份
2014/11/30 Python
Python装饰器的函数式编程详解
2015/02/27 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
2016/03/21 Python
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
宠物店的创业计划书范文
2014/01/11 职场文书
群众路线党课主持词
2014/04/01 职场文书
网站客服岗位职责
2014/04/05 职场文书
初三学生评语大全
2014/04/24 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
2015年妇产科工作总结
2015/05/18 职场文书
2016党员读书思廉心得体会
2016/01/23 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
Python 发送SMTP邮件的简单教程
2021/06/24 Python
html解决浏览器记住密码输入框的问题
2023/05/07 HTML / CSS