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 相关文章推荐
PHP中Session的概念
Oct 09 PHP
我的论坛源代码(四)
Oct 09 PHP
有关 PHP 和 MySQL 时区的一点总结
Mar 26 PHP
网页游戏开发入门教程三(简单程序应用)
Nov 02 PHP
PHP 开发环境配置(Zend Server安装)
Apr 28 PHP
PHP中操作ini配置文件的方法
Apr 25 PHP
基于session_unset与session_destroy的区别详解
Jun 03 PHP
php模拟服务器实现autoindex效果的方法
Mar 10 PHP
php打乱数组二维数组多维数组的简单实例
Jun 17 PHP
php实现的debug log日志操作类实例
Jul 12 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
Apr 21 PHP
PHP simplexml_load_file()函数讲解
Feb 03 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技术开发技巧分享
2010/03/23 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
PHP通过加锁实现并发情况下抢码功能
2016/08/10 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
使用jquery实现select添加实现后台权限添加的效果
2011/05/28 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
JS将光标聚焦在文本最后的实现代码
2014/03/28 Javascript
js动态添加表格数据使用insertRow和insertCell实现
2014/05/22 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
实现React单页应用的方法详解
2016/08/02 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
React全家桶环境搭建过程详解
2018/05/18 Javascript
深入理解JavaScript的值传递和引用传递
2018/10/24 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
2019/04/30 Javascript
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
Python3.2中的字符串函数学习总结
2015/04/23 Python
Python中你应该知道的一些内置函数
2017/03/31 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
2019/04/18 Python
python如何获得list或numpy数组中最大元素对应的索引
2020/11/16 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
美国山地自行车、露营、户外装备和服装购物网站:Aventuron
2018/05/05 全球购物
美国智能家居专家:tink
2019/06/04 全球购物
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
2014年两会学习心得体会
2014/03/17 职场文书
竞选学生会主席演讲稿
2014/04/24 职场文书
公司担保书格式范文
2014/05/12 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
2014大学生学生会工作总结
2014/12/19 职场文书
全国爱牙日活动总结
2015/02/05 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
对象析构函数__del__在Python中何时使用
2022/03/22 Python