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&amp;MYSQL分页原理及实现
Jan 02 PHP
PHP的5个安全措施小结
Jul 17 PHP
解析php入库和出库
Jun 25 PHP
用 Composer构建自己的 PHP 框架之基础准备
Oct 30 PHP
php中addslashes函数与sql防注入
Nov 17 PHP
PHP将session信息存储到数据库的类实例
Mar 04 PHP
php获取网页里所有图片并存入数组的方法
Apr 06 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
php读取txt文件并将数据插入到数据库
Feb 23 PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
Jun 11 PHP
关于PHP转换超过2038年日期出错的问题解决
Jun 28 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 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和ACCESS写聊天室(十)
2006/10/09 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
JavaScript中自定义事件用法分析
2014/12/23 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
实现前后端数据交互方法汇总
2015/04/07 Javascript
JavaScript中Null与Undefined的区别解析
2015/06/30 Javascript
easy ui datagrid 从编辑框中获取值的方法
2017/02/22 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
2019/02/22 Javascript
layui实现根据table数据判断按钮显示情况的方法
2019/09/26 Javascript
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
详解Java中String JSONObject JSONArray List转换
2020/11/13 Javascript
[58:35]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
深入理解python中sort()与sorted()的区别
2018/08/29 Python
Python下简易的单例模式详解
2019/04/08 Python
Python文字截图识别OCR工具实例解析
2020/03/05 Python
python上selenium的弹框操作实现
2020/07/13 Python
python logging模块的使用详解
2020/10/23 Python
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
小学生开学感言
2014/02/28 职场文书
企业新年寄语
2014/04/04 职场文书
村党支部书记四风问题个人对照检查材料思想汇报
2014/10/06 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
社区干部培训心得体会
2016/01/06 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书
如何用JavaScipt测网速
2021/05/09 Javascript
python 如何在list中找Topk的数值和索引
2021/05/20 Python
清空 Oracle 安装记录并重新安装
2022/04/26 Oracle