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."<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类型处理,要么自己写函数。
转载于:https://www.cnblogs.com/shanyansheng/p/5580232.html
PHP中IP地址与整型数字互相转换详解相关推荐
- ip地址转换数字函数 iton_PHP中IP地址与整型数字互相转换详解
IP转换成整型存储是数据库优化一大趋势,不少人目前存储IP时还在使用字符串类型存储,字符串索引比整型索引消耗资源很多,特别是表中数据量大的时候,以及求查询某一个ip段的数据,今天说的ip是指ip4,i ...
- IP 地址与整数之间的互相转换详解
IP 地址的"构造"是由 32 位二进制数组成的. IP地址转换为整数的代码: 或者: 优化如下: 分析:IP 地址的每段可以看成是一个 0-255 的整数,把每段拆分成一个二进制 ...
- 字符IP地址和整型数转换
IP(Internet Protocol),IP地址中文名称为互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写.IP地址 ...
- DNS服务器、IP地址、子网掩码、默认网关的详解
一.DNS服务器 DNS是指:域名服务器(Domain Name Server).在Internet上域名与IP地址之间是一一对应的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转 ...
- linux中使用egrep取值ip地址,egrep命令_Linux egrep 命令用法详解:在文件内查找指定的字符串...
egrep命令用于在文件内查找指定的字符串.egrep执行效果与grep -E相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法.egrep是用extended regu ...
- 将整型数字转化成大写格式
将整型数字转化成大写格式 将整型数字转化成大写格式 我们日常报表的打印,单据打印,借据.收据打印等等操作都需要用到将金额装换成大写,防止交易双方通过修改单据数字,因而我们的信息管理系统就把账单的金额转 ...
- 整型数字转换成罗马数字
版权声明:本文为博主原创文章,转载请注明出处. 个人博客地址:https://yangyuanlin.club 欢迎来踩~~~~ integer to roman Given an integer, ...
- 使用CDN之后APACHE日志记录中IP地址不正确的解决方案
这篇文章主要介绍了使用CDN之后APACHE日志记录中IP地址不正确的解决方案,需要的朋友可以参考下 最近在搞APACHE日志分析,装好了awstats之后,这两天进行了观察, 报表日期 月 1 月 ...
- 1295. 统计位数为偶数的数字(to_string 将整型数字变为字符串)
给你一个整数数组 nums,请你返回其中位数为 偶数 的数字的个数. 示例 1: 输入:nums = [12,345,2,6,7896] 输出:2 解释: 12 是 2 位数字(位数为偶数) 345 ...
最新文章
- 如何参与贡献Dubbo社区
- js去掉前后空格的函数_2020年最火爆的Vue.js面试题
- 关于Android开发中Arm、X86和Mips(草稿)
- android日志收集存入mysql_rsyslog+analyzer+mysql实现日志收集展示
- 发布安全Web站点详细攻略:ISA2006系列之十四
- android 动态移动xy,android – 如何使用AChartEngine动态线图和X轴自动平移(滚动)?...
- Django从理论到实战(part20)--DLT常用过滤器
- 电路 第五版 第一章 电路模型和电路定律
- 武汉大学计算机学院参考书目,2020武汉大学计算机与软件工程考研初试科目、参考书目及复试详情...
- Java读取HttpServletRequest的post数据流
- R语言快速读取数据方法
- Atom 编辑器系列视频课程
- Win32汇编——过程控制(进程调试和进程隐藏)
- asp判断是否移动端_ASP判断当前访问的是PC端还是移动设备端
- Java中字符串的拼接和转义
- 【STM32H7的DSP教程】第17章 DSP功能函数-定点数互转
- 经典贪吃蛇大战逆向 去广告+游戏内购
- 什么是SMART原则
- 辽宁师范大学计算机科学与技术在哪个校区,2021年辽宁师范大学有几个校区,大一新生在哪个校区...
- 订单下单成功后如何等待支付成功