ip地址转换数字函数 iton_PHP中IP地址与整型数字互相转换详解
IP转换成整型存储是数据库优化一大趋势,不少人目前存储IP时还在使用字符串类型存储,字符串索引比整型索引消耗资源很多,特别是表中数据量大的时候,以及求查询某一个ip段的数据,今天说的ip是指ip4,ip6不在本文范围内。
系统函数ip2long与long2ipPHP中有内置函数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]<<24))|(intval($iparr[1])<<16)|(intval($iparr[2])<<8)| (intval($iparr[3]));
}
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类型处理,要么自己写函数。
ip地址转换数字函数 iton_PHP中IP地址与整型数字互相转换详解相关推荐
- PHP中IP地址与整型数字互相转换详解
这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友可以参考下 IP转换成 ...
- ip地址转换数字函数 iton_DataLakeAnalytics: 解析IP地址对应的国家城市的函数
Data Lake Analytics 作为云上数据处理的枢纽,最近加入了通过IP地址查找对应的国家.省份.城市.ISP的函数, 今天带大家体验一下. 函数详细介绍 本次一共添加了下面这些函数: ip ...
- ip地址转换数字函数 iton_字符串IP地址转换成IP数值函数
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_IP2Int]') and xtype in (N'FN ...
- ip地址转换数字函数 iton_IP地址的字符串形式和数字形式之间的相互转换函数
最近要用到网络编程的东西,差一点自己去山寨已有的函数.基础不好,不知道已有函数可以满足需要,呵呵. 这个示例程序说的是ip地址的数字形式和字符串形式之间的相互转换. 从字符串形式转换到数字形式: in ...
- EXCEL 中自定义函数的应用(关于 XOR 在 EXCEL 中的用法 及 文本型数字求和)
EXCEL 中,能否同调用内置函数一样在工作表中调用自已制作的自定义函数,出现对话框.同时也能做到像内置函数对话框里的说明?答案是肯定的,下面举例说明: 题目: ①对文本型一系列数字进行求和(SUM( ...
- Python之pandas:pandas中to_csv()、read_csv()函数的index、index_col(不将索引列写入)参数详解之详细攻略
Python之pandas:pandas中to_csv().read_csv()函数的index.index_col(不将索引列写入)参数详解之详细攻略 目录 pandas中to_csv().read ...
- html内置时间对象,JavaScript中的常用事件,以及内置对象详解
原标题:JavaScript中的常用事件,以及内置对象详解 今天是刘小爱自学Java的第81天. 感谢你的观看,谢谢你. 话不多说,开始今天的学习: 学前端有一个非常权威的组织,也就是w3c,其有个专 ...
- php sprintf 后面补0,PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
下面小编就为大家带来一篇PHP数字前补0的自带函数sprintf 和number_format的用法(详解).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 很多时候我们 ...
- python 读取图片转换为一维向量_对Python中一维向量和一维向量转置相乘的方法详解...
对Python中一维向量和一维向量转置相乘的方法详解 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况.但是在pyth ...
最新文章
- 回顾2013 - 技术上
- CTFshow 反序列化 web273
- 数字时代企业内部如何高效协作?这款工具值得一试
- pdf安装包_有么有pdf控件,不需要用户安装任何安装包直接打印的?
- 拒绝双写:巧用Lindorm数据订阅
- 使用动态代理解决网站字符集编码问题:(之前通过拦截器)
- javascript-网页换肤案例
- ssis for循环容器_SSIS包中的序列容器
- 保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护 2
- Linux学习笔记二十——系统裁剪之二
- android tv webview,Android TV开发---WebView焦点处理
- IT程序猿应该投资些什么
- WPF 使用值转换器进行绑定数据的转换IValueConverter
- 软件测试第三次作业-worldCount
- Visio绘图怎么对齐连接点
- Ubuntu 18.04 安装NVIDIA显卡驱动教程
- 记一次联想Y7000P安装黑apple系统地经历
- 服务器的安全措施有哪些呢?
- 上顿号符号_顿号在键盘上怎么打?每日一答
- 【回归预测-PNN分类】基于粒子群算法群优化概率神经网络算法实现空气质量评价预测附matlab代码
热门文章
- addEventListener和attachEvent的区别
- 达梦数据库索引的创建与测试
- 修复office 2007或2010安装程序找不到Proplas.ww/Proplsww.cab
- vue+jsplumb 实现根据数据渲染出连线绘图
- c语言细胞自动机,细胞自动机之兰顿蚂蚁
- The Matrix(黑客帝国)
- 手机二要素认证接口怎么用?手机号姓名验证怎么操作?
- Excel - 学习 - 笔记6: Excel 函数 - filter 函数
- 内网后渗透,生成免杀后门!!
- [附源码]Python计算机毕业设计Django自行车租赁管理系统