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应用程序来获取Web服务器的状态信息
Oct 09 PHP
php和js交互一例-PHP教程,PHP应用
Jan 03 PHP
PHP daddslashes 使用方法介绍
Oct 26 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
Aug 28 PHP
php中file_get_content 和curl以及fopen 效率分析
Sep 19 PHP
php 删除cookie方法详解
Dec 01 PHP
php通过array_merge()函数合并两个数组的方法
Mar 18 PHP
PHP CURL 多线程操作代码实例
May 13 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
Jun 20 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
Nov 21 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
Aug 03 PHP
php实现等比例压缩图片
Jul 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
PHP生成条形图的方法
2014/12/10 PHP
linux中cd命令使用详解
2015/01/08 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
jquery获取特定name所有选中的checkbox,支持IE9标准模式
2013/03/18 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
JS调用CS里的带参方法实例
2013/08/01 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
javascript常用方法总结
2015/05/14 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
Node.js开发者必须了解的4个JS要点
2016/02/21 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
Vue基础学习之项目整合及优化
2019/06/02 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
Vue Element校验validate的实例
2020/09/21 Javascript
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
对python中的高效迭代器函数详解
2018/10/18 Python
python从入门到精通 windows安装python图文教程
2019/05/18 Python
python flask框架实现重定向功能示例
2019/07/02 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
python自动结束mysql慢查询会话的实例代码
2019/10/27 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
美国从事品牌鞋类零售的连锁店:Famous Footwear
2016/08/25 全球购物
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
ASOS西班牙官网:英国在线时尚和美容零售商
2020/01/10 全球购物
高中考试作弊检讨书
2014/01/14 职场文书
搞笑征婚广告词
2014/03/17 职场文书
超市促销活动总结
2014/07/01 职场文书
2014年监理工作总结范文
2014/11/17 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书
Python网络编程之ZeroMQ知识总结
2021/04/25 Python
Win11右下角图标点了没反应怎么办?Win11点击右下角图标无反应解决方法汇总
2022/07/07 数码科技