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
一个可以找出源代码中所有中文的工具
Oct 25 PHP
PHP 字符串 小常识
Jun 05 PHP
基于PHP CURL获取邮箱地址的详解
Jun 03 PHP
探讨php中遍历二维数组的几种方法详解
Jun 08 PHP
基于PHPExcel的常用方法总结
Jun 13 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
May 07 PHP
PHP中的reflection反射机制测试例子
Aug 05 PHP
php多次include后导致全局变量global失效的解决方法
Feb 28 PHP
PHP性能优化大全(php.ini)
May 20 PHP
PHP ADODB实现事务处理功能示例
May 25 PHP
PHP chunk_split()函数讲解
Feb 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小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
在SAE上搭建最新wordpress的方法
2014/12/21 PHP
微信支付开发交易通知实例
2016/07/12 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
PHP 二维array转换json的实例讲解
2018/08/21 PHP
从新浪弄下来的全屏广告代码 与使用说明
2007/03/15 Javascript
JavaScript 语言的递归编程
2010/05/18 Javascript
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
javascript运行机制之this详细介绍
2014/02/07 Javascript
在JavaScript里防止事件函数高频触发和高频调用的方法
2014/09/06 Javascript
详解JavaScript中Date.UTC()方法的使用
2015/06/12 Javascript
基于zepto.js简单实现上传图片
2016/06/21 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
div实现自适应高度的textarea实现angular双向绑定
2017/01/08 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
在Vue中使用echarts的方法
2018/02/05 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
centos 下面安装python2.7 +pip +mysqld
2014/11/18 Python
python简单获取本机计算机名和IP地址的方法
2015/06/03 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
Pycharm安装第三方库失败解决方案
2020/11/17 Python
python制作抽奖程序代码详解
2021/01/15 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
我们的节日中秋活动方案
2014/08/19 职场文书
2014年数学教研组工作总结
2014/12/06 职场文书
实习计划书范文
2015/01/16 职场文书
计算机专业自荐信
2015/03/05 职场文书
运动会通讯稿300字
2015/07/20 职场文书
家长会后的感想
2015/08/11 职场文书
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript