PHP中IP地址与整型数字互相转换详解


Posted in PHP onAugust 20, 2014

IP转换成整型存储是数据库优化一大趋势,不少人目前存储IP时还在使用字符串类型存储,字符串索引比整型索引消耗资源很多,特别是表中数据量大的时候,以及求查询某一个ip段的数据,今天说的ip是指ip4,ip6不在本文范围内。

系统函数ip2long与long2ip
PHP中有内置函数ip2long可以将ip地址转换整型。

$ip = '210.110.11.49';

echo ip2long($ip);

输出:
-764540111

输出的整型有负号是因为我们得到的结果是有符号整型,有符号整型最大值2147483647,要把结果转换为无符号型可以这么写:
3530427185

使用long2ip把整型转换回ip地址

$ip = '210.110.11.49';

$ip_int = ip2long($ip);

echo $ip."<br />";

echo $ip_int."<br />";

echo long2ip($ip_int);

输出:
210.110.11.49

-764540111

210.110.11.49

从结果可以看到,ip与整型可以通过函数完成。

系统函数小bug

这中bug网上一搜都是,大意说的是ip某段加个前导0,先来看看这个bug实例

$ip = '210.110.011.49';

$ip_int = ip2long($ip);

echo $ip."<br />";

echo $ip_int."<br />";

echo long2ip($ip_int);

输出:
210.110.011.49

-764540623

210.110.9.49

转换结果不匹配,我们试着在ip第一段数字前加前导0,再看看

$ip = '021.110.11.49';

$ip_int = ip2long($ip);

echo $ip."<br />";

echo $ip_int."<br />";

echo long2ip($ip_int);

输出:
021.110.11.49

292424497

17.110.11.49

转换结果都出错。以上例子都是因为加了前导0后导致转换结果出错,连带逆转结果与原转换ip不匹配。

转换原理

目前有两个算法:
第一、第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256、最后总和

$ip = '0210.110.11.49';

 

function ipToInt($ip){

    $iparr = explode('.',$ip);

    $num = 0;

    for($i=0;$i<count($iparr);$i++){

        $num += intval($iparr[$i]) * pow(256,count($iparr)-($i+1));

    }

    return $num;

}

 

echo  $ip.'<br />';

$ip_int = ipToInt($ip);

echo $ip_int.'<br />';

echo long2ip($ip_int);

输出:
0210.110.11.49

3530427185

210.110.11.49

第二、通过位运算符

$ip = '0210.110.11.49';

 

function ipToInt($ip){

    $iparr = explode('.',$ip);

    return (intval($iparr[0]<<24))|(intval($iparr[1])<<16)|(intval($iparr[2])<<8)| (intval($iparr[3]));

}

 

echo  $ip.'<br />';

$ip_int = ipToInt($ip);

echo $ip_int.'<br />';

echo long2ip($ip_int);

输出:
0210.110.11.49

-764540111

210.110.11.49

检测IP是否合法

第一、自己遍历检测

function check_ip($ip){

    $iparr = explode('.',$ip);

    foreach($iparr as $v){ if($v>255) return false; }

    return true;

}

 

echo '210.285.11.49,';

var_dump(check_ip('210.285.11.49'));

echo '<br />';

echo '210.205.11.49,';

var_dump(check_ip('210.205.11.49'));

[code]
输出:

[code]

210.285.11.49,bool(false)

210.205.11.49,bool(true)

第二、使用ip2long返回
function check_ip($ip){

    if(ip2long($ip)) return true;

    return false;

}

 

echo '210.285.11.49,';

var_dump(check_ip('210.285.11.49'));

echo '<br />';

echo '210.205.11.49,';

var_dump(check_ip('210.205.11.49'));

输出:
210.285.11.49,bool(false)

210.205.11.49,bool(true)

后记

不少人把ip写库用ip2long转换存放int类型的字段中,但是,在不同的系统平台上,ip2long函数得到的值是不同的,因此可能造成在从数据库中读出数据逆转ip时用long2ip得到的ip与原ip不符合
如果是mysql可以使用mysql系统函数INET_ATON与INET_NTOA解决,或者使用bigint类型处理,要么自己写函数。

PHP 相关文章推荐
php5编程中的异常处理详细方法介绍
Jul 29 PHP
PHP获取文件绝对路径的代码(上一级目录)
May 29 PHP
解析如何用php screw加密php源代码
Jun 20 PHP
php增删改查示例自己写的demo
Sep 04 PHP
PHP加密函数 Javascript/Js 解密函数
Sep 23 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
Jun 04 PHP
php的闭包(Closure)匿名函数详解
Feb 22 PHP
PHP发送短信代码分享
Aug 11 PHP
分享50个提高PHP执行效率的技巧
Dec 26 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
Jul 18 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
Oct 23 PHP
有关PHP 中 config.m4 的探索
Aug 26 PHP
PHP函数http_build_query使用详解
Aug 20 #PHP
PHP函数in_array()使用详解
Aug 20 #PHP
PHP中使用json数据格式定义字面量对象的方法
Aug 20 #PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
Aug 19 #PHP
浅谈php函数serialize()与unserialize()的使用方法
Aug 19 #PHP
PHP将回调函数作用到给定数组单元的方法
Aug 19 #PHP
php实现文件下载代码分享
Aug 19 #PHP
You might like
PHP 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
php 文件上传代码(限制jpg文件)
2010/01/05 PHP
PHP中的错误处理、异常处理机制分析
2012/05/07 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
54个提高PHP程序运行效率的方法
2015/07/19 PHP
PHP上传文件参考配置大文件上传
2015/12/16 PHP
PHP使用token防止表单重复提交的方法
2016/04/07 PHP
PHP 微信扫码支付源代码(推荐)
2016/11/03 PHP
jquery如何获取复选框的值
2013/12/12 Javascript
jQuery实现的原图对比窗帘效果
2014/06/15 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
switchery按钮的使用方法
2017/12/18 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
2019/11/18 Javascript
关于vue3.0中的this.$router.replace({ path: '/'})刷新无效果问题
2020/01/16 Javascript
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
django从请求到响应的过程深入讲解
2018/08/01 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
对python mayavi三维绘图的实现详解
2019/01/08 Python
python write无法写入文件的解决方法
2019/01/23 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
python打开windows应用程序的实例
2019/06/28 Python
Python 中 -m 的典型用法、原理解析与发展演变
2019/11/11 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
2020/09/16 Python
Python爬虫之App爬虫视频下载的实现
2020/12/08 Python
化工专业推荐信范文
2013/11/28 职场文书
金融行业务员的自我评价
2013/12/13 职场文书
租房协议书范本
2014/04/09 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
Pytorch使用shuffle打乱数据的操作
2021/05/20 Python
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB