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 09 PHP
php 无限分类的树类代码
Dec 03 PHP
PHP读取ACCESS数据到MYSQL的代码
May 11 PHP
PHP漏洞全解(详细介绍)
Nov 13 PHP
解决ajax+php中文乱码的方法详解
Jun 09 PHP
推荐一款MAC OS X 下php集成开发环境mamp
Nov 08 PHP
Windows7下的php环境配置教程
Feb 28 PHP
PHP实现的迷你漂流瓶
Jul 29 PHP
Yii视图CGridView列表用法实例分析
Jul 12 PHP
PHP回调函数与匿名函数实例详解
Aug 16 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
Oct 26 PHP
php实现JWT(json web token)鉴权实例详解
Nov 05 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
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
2017/06/06 PHP
Laravel find in set排序实例
2019/10/09 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
javascript 页面只自动刷新一次
2009/07/10 Javascript
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
jquery多行滚动/向左或向上滚动/响应鼠标实现思路及代码
2013/01/23 Javascript
JavaScript中计算网页中某个元素的位置
2015/06/10 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
2016/05/14 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
基于bootstrap-datetimepicker.js不支持IE8的快速解决方法
2016/11/07 Javascript
通过AngularJS实现图片上传及缩略图展示示例
2017/01/03 Javascript
Webpack打包慢问题的完美解决方法
2017/03/16 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
基于JavaScript实现瀑布流布局
2018/08/15 Javascript
基于layPage插件实现两种分页方式浅析
2019/07/27 Javascript
node express使用HTML模板的方法示例
2019/08/22 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
[53:29]完美世界DOTA2联赛循环赛 DM vs Matador BO2第二场 11.04
2020/11/05 DOTA
解读Python编程中的命名空间与作用域
2015/10/16 Python
Python正规则表达式学习指南
2016/08/02 Python
浅谈function(函数)中的动态参数
2017/04/30 Python
python写程序统计词频的方法
2019/07/29 Python
对Django url的几种使用方式详解
2019/08/06 Python
Django为窗体加上防机器人的验证码功能过程解析
2019/08/14 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
Python unittest生成测试报告过程解析
2020/09/08 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
Optimalprint加拿大:在线打印服务
2020/04/03 全球购物
节能环保口号
2014/06/12 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
敬业奉献模范事迹材料(2016精选版)
2016/02/26 职场文书
索尼ICF-5900W收音机测评
2022/04/24 无线电