搜索
首页php教程php手册PHP中IP地址与整型数字互相转换详解

这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友

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."
";
echo $ip_int."
";
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."
";
echo $ip_int."
";
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."
";
echo $ip_int."
";
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         $num += intval($iparr[$i]) * pow(256,count($iparr)-($i+1));
    }
    return $num;
}
 
echo  $ip.'
';
$ip_int = ipToInt($ip);
echo $ip_int.'
';
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] }
 
echo  $ip.'
';
$ip_int = ipToInt($ip);
echo $ip_int.'
';
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 '
';
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 '
';
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类型处理,要么自己写函数。

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具