PHP基于ip2long实现IP转换整形


Posted in PHP onDecember 11, 2020

如何将四个字段以点分开的IP网络址协议地址转换成整数呢?PHP里有这么一个函数ip2long.比如

<?php
echo ip2long("10.2.1.3");
?>

我们将得到

167903491

这是如何计算的,目前我知道有两个算法。其一

<?php
function ip2int($ip){
  //我们先把ip分为四段,$ip1,$ip2,$ip3,$ip4
  list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip);
  //然后第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256
  //这即是我们得到的值
  return $ip1*pow(256,3)+$ip2*pow(256,2)+$ip3*256+$ip4;
}
?>

其二,用位运算

<?php
function ip2int($ip){
  list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip);
  return ($ip1<<24)|($ip2<<16)|($ip3<<8)|($ip4);
}
?>

我们会发现,有些ip转化成整数后,是负的,这是因为得到的结果是有符号整型,最大值是2147483647.要把它转化为无符号的,可以用
sprintf("%u",ip2long($ip);

就能转换为正整数。而且得到的结果用long2ip也可以正常转换回原来的ip地址。也可以用ip2long来验证一个ip是否是有效的,如

<?php
function chk_ip($ip){
  if(ip2long($ip)=="-1") {
    return false;
  }
  return true;
}
//应用
var_export(chk_ip("10.111.149.42"));
var_export(chk_ip("10.111.256.42"));
?>

将输出true和false

把ip数据保存在数据库(MySQL)中时候,我们习惯用ip2long函数生成整型,然后存放在一个int(11)类型的字段中,但是,在不同的系统平台上,ip2long函数得到的值是不同的,因此可能造成在从数据库中读出数据,用long2ip得到ip的时候产生错误,说一下我们碰到的情况:

我们用一个int(11)类型(范围-2147483648 - 2147483647)来保存把一个ip地址用ip2long处理得到的结果,例如ip是'202.105.77.179′,那么在32位机器上得到的结果是:-899068493,而在64位机器上却得到3395898803.然后把它写入数据库,由于超过int(11)的范围,因此64位机器上的结果被保存为int(11)的最大值:2147483647.于是在从数据库中取出的时候,便得到了错误的结果,会得到”127.255.255.255″这个ip地址.

解决的办法很多,比如可以用mysql的函数:INET_ATON和INET_NTOA来处理ip地址;或者把保存ip地址的字段改为bigint类型,这样在64位机器上虽然保存的是3395898803,使用long2ip函数仍能得到正确的结果.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP file_get_contents 函数超时的几种解决方法
Jul 30 PHP
C/S和B/S两种架构区别与优缺点分析
Oct 23 PHP
php的curl封装类用法实例
Nov 07 PHP
php函数与传递参数实例分析
Nov 15 PHP
再Docker中架设完整的WordPress站点全攻略
Jul 29 PHP
PHP实现简单爬虫的方法
Jul 29 PHP
PHP 输出缓冲控制(Output Control)详解
Aug 25 PHP
php中使用websocket详解
Sep 23 PHP
php foreach如何跳出两层循环(详解)
Nov 05 PHP
PHP实现表单提交时去除斜杠的方法
Dec 26 PHP
php获取今日开始时间和结束时间的方法
Feb 27 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 PHP
PHP哈希表实现算法原理解析
Dec 11 #PHP
PHP解决高并发的优化方案实例
Dec 10 #PHP
WordPress伪静态规则设置代码实例
Dec 10 #PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
Dec 10 #PHP
php解析非标准json、非规范json的方式实例
Dec 10 #PHP
PHP连接MySQL数据库三种实现方法
Dec 10 #PHP
discuz论坛更换域名,详细文件修改步骤
Dec 09 #PHP
You might like
CakePHP去除默认显示的标题及图标的方法
2008/10/22 PHP
php简单的会话类代码
2011/08/08 PHP
zend Framework中的Layout(模块化得布局)详解
2013/06/28 PHP
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
JavaScript采用递归算法计算阶乘实例
2015/08/04 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
javascript实现查找数组中最大值方法汇总
2016/02/13 Javascript
javascript拖拽效果延伸学习
2016/04/04 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
Js中async/await的执行顺序详解
2017/09/22 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
layui导出所有数据的例子
2019/09/10 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
全面解读Python Web开发框架Django
2014/06/30 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
Python2与Python3的区别实例分析
2019/04/11 Python
Python 学习教程之networkx
2019/04/15 Python
python基于SMTP协议发送邮件
2019/05/31 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
pytest中文文档之编写断言
2019/09/12 Python
python内打印变量之%和f的实例
2020/02/19 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
2020/03/08 Python
使用Python通过oBIX协议访问Niagara数据的示例
2020/12/04 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
HTML5中Localstorage的使用教程
2015/07/09 HTML / CSS
企业仓管员岗位职责
2014/06/15 职场文书
社区党建工作汇报材料
2014/10/27 职场文书
班主任高考寄语
2015/02/26 职场文书
工作年限证明范本
2015/06/15 职场文书
如何使用JavaScript策略模式校验表单
2021/04/29 Javascript
Mysql systemctl start mysqld报错的问题解决
2021/06/03 MySQL
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技