这篇文章主要介绍了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地址与整型数字互相转换详解相关推荐

  1. ip地址转换数字函数 iton_PHP中IP地址与整型数字互相转换详解

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

  2. IP 地址与整数之间的互相转换详解

    IP 地址的"构造"是由 32 位二进制数组成的. IP地址转换为整数的代码: 或者: 优化如下: 分析:IP 地址的每段可以看成是一个 0-255 的整数,把每段拆分成一个二进制 ...

  3. 字符IP地址和整型数转换

      IP(Internet Protocol),IP地址中文名称为互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写.IP地址 ...

  4. DNS服务器、IP地址、子网掩码、默认网关的详解

    一.DNS服务器 DNS是指:域名服务器(Domain Name Server).在Internet上域名与IP地址之间是一一对应的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转 ...

  5. linux中使用egrep取值ip地址,egrep命令_Linux egrep 命令用法详解:在文件内查找指定的字符串...

    egrep命令用于在文件内查找指定的字符串.egrep执行效果与grep -E相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法.egrep是用extended regu ...

  6. 将整型数字转化成大写格式

    将整型数字转化成大写格式 将整型数字转化成大写格式 我们日常报表的打印,单据打印,借据.收据打印等等操作都需要用到将金额装换成大写,防止交易双方通过修改单据数字,因而我们的信息管理系统就把账单的金额转 ...

  7. 整型数字转换成罗马数字

    版权声明:本文为博主原创文章,转载请注明出处. 个人博客地址:https://yangyuanlin.club 欢迎来踩~~~~ integer to roman Given an integer, ...

  8. 使用CDN之后APACHE日志记录中IP地址不正确的解决方案

    这篇文章主要介绍了使用CDN之后APACHE日志记录中IP地址不正确的解决方案,需要的朋友可以参考下 最近在搞APACHE日志分析,装好了awstats之后,这两天进行了观察, 报表日期 月 1 月 ...

  9. 1295. 统计位数为偶数的数字(to_string 将整型数字变为字符串)

    给你一个整数数组 nums,请你返回其中位数为 偶数 的数字的个数. 示例 1: 输入:nums = [12,345,2,6,7896] 输出:2 解释: 12 是 2 位数字(位数为偶数) 345 ...

最新文章

  1. 如何参与贡献Dubbo社区
  2. js去掉前后空格的函数_2020年最火爆的Vue.js面试题
  3. 关于Android开发中Arm、X86和Mips(草稿)
  4. android日志收集存入mysql_rsyslog+analyzer+mysql实现日志收集展示
  5. 发布安全Web站点详细攻略:ISA2006系列之十四
  6. android 动态移动xy,android – 如何使用AChartEngine动态线图和X轴自动平移(滚动)?...
  7. Django从理论到实战(part20)--DLT常用过滤器
  8. 电路 第五版 第一章 电路模型和电路定律
  9. 武汉大学计算机学院参考书目,2020武汉大学计算机与软件工程考研初试科目、参考书目及复试详情...
  10. Java读取HttpServletRequest的post数据流
  11. R语言快速读取数据方法
  12. Atom 编辑器系列视频课程
  13. Win32汇编——过程控制(进程调试和进程隐藏)
  14. asp判断是否移动端_ASP判断当前访问的是PC端还是移动设备端
  15. Java中字符串的拼接和转义
  16. 【STM32H7的DSP教程】第17章 DSP功能函数-定点数互转
  17. 经典贪吃蛇大战逆向 去广告+游戏内购
  18. 什么是SMART原则
  19. 辽宁师范大学计算机科学与技术在哪个校区,2021年辽宁师范大学有几个校区,大一新生在哪个校区...
  20. 订单下单成功后如何等待支付成功

热门文章

  1. 写给那些正奔三的80后[转]
  2. Visual Studio 2010 概念型IDE
  3. Bundler 的作用及原理
  4. fseek获取大于4G的文件大小的问题
  5. 【上】安全HTTPS-全面详解对称加密,非对称加密,数字签名,数字证书和HTTPS
  6. python实现单例模式
  7. (原創) 由一維陣列模擬二維陣列(多維陣列) (C/C++)
  8. Rhel7 Ldap为本地用户认证方式,设置域、服务器位置和下载key
  9. nginx 安装与配置
  10. centos 6.5 搭建lnmp环境