php判断ipv6是否在范围内,[PHP] IPv6檢查IP是否在某個網段內 mtachcidr6
自動目錄
由於 IPv4 可以轉成十進位用推移的運算,但是 IPv6 要轉成十進位的話,會超過有效位數的顯示,另外由於ipv6本身是用十六進位表示,沒必要換成10進位。所以要用更漂亮的作法。我把他寫成 class = =!!:
函式
/**
* ipv6 class by axer@ms1.boe.tcc.edu.tw
*/
class ipv6{
/**
* ExpandIPv6Notation2Bin()- Convert an ipv6 address to bin string
* @param string $ip6 - an ipv6 address
* @return return the binary string of an ipv6 address if parameter ip6 is an ipv6 address,
* else it return an empty string.
*/
public function ExpandIPv6Notation2Bin($ip6) {
if (strpos($ip6, '::') !== false)
$ip6 = str_replace('::', str_repeat(':0', 8 - substr_count($ip6, ':')).':', $ip6);
$ip6parts = explode(':', $ip6);
$res="";
foreach ($ip6parts as $part)
$res .= str_pad(base_convert( $part, 16, 2), 16, 0, STR_PAD_LEFT);
return $res;
}
/**
* MatchCIDR6 -- Check if an ipv6 address is in the CDIR6 subnet.
* @param string $cidr6 - an ipv6 subnet, ex 2001:288:5400/39 or 2001:288:5432:/64 or 2001:288:5478::/64..
* @param string $chkipv6 - an ipv6 address, ex ::1, 2001:288:5200::1, :: ,etc.
* @return return true if $chkipv6 is inside the $cidr6 subnet, or return false.
*/
public function MatchCIDR6( $cidr6, $chkipv6)
{
list($ip6, $prefixlen) = explode('/', $cidr6);
$cidrbin= substr( $this->ExpandIPv6Notation2Bin($ip6), 0, $prefixlen);
$chkip6bin= substr( $this->ExpandIPv6Notation2Bin($chkipv6), 0, $prefixlen);
if(! strcmp($cidrbin,$chkip6bin))return true;
return false;
}
}
用法
$cidr6 = "2001:288:5400/39";
$ip6= "2001:288:5300:000::72A:4BE7";
$o_ipv6 = new ipv6();
// 檢查是ip6 是否在網段內
if( $o_ipv6->MatchCIDR6($cidr6,$ip6))
print "Inside";
else
print "Outside";
備註:有參考別人的程式,不過來源佚失了
相關連結
原文 2009-11-26
php判断ipv6是否在范围内,[PHP] IPv6檢查IP是否在某個網段內 mtachcidr6相关推荐
- 利用叉乘快速判断点是否在三角形内
利用叉乘快速判断点是否在三角形内 判断P是否在三角形ABC内: 向量: pa = P - A, ca = C - A; ba = B - A; 如果向量 cross(ca, pa)与向量 cross ...
- 【Unity3D自学记录】判断物体是否在镜头内
判断物体是否在镜头内. 其实很简单的方法 代码如下: [csharp] view plaincopy using UnityEngine; using System.Collections; publ ...
- 判断点是否处于多边形内的三种方法(转)
1. 叉乘判别法(只适用于凸多边形)想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断 ...
- 判断点是否在凸多边形内
文章目录 判断点是否在凸多边形内 1,原理 2.右手坐标系 3.向量叉积 补充知识: 可以理解利用向量的叉积,很容易判定一个多边形的凹凸性.也可以判定点是否在多边形的内部. - 判定多边形的凹凸性 判 ...
- 判断网页是否为微信内置浏览器打开?
文章目录 (两种方法)教你:"如何判断网页是不是在微信端内置浏览器打开?" 本文根据项目开发实际情况,着重探讨在微信内置浏览器中调用支付功能,遇到的几个坑! 目的: (方法一)全部 ...
- js 日期比较大小,js判断日期是否在区间内,js判断时间段是否在另外一个时间段内...
/** * 日期解析,字符串转日期 * @param dateString 可以为2017-02-16,2017/02/16,2017.02.16 * @returns {Date} 返回对应的日期对 ...
- 如何判断一个点在多边形内
一.从三角形开始说起---怎么判断一个点在三角形内 三角形是最简单的多边形了.先说说三角形有哪些判断方法. 参考自:判断一个点是否在三角形内部 - 知乎 几种方法判断平面点在三角形内_独L无二的博客- ...
- 判断一点是否在多边形内(附Java实现代码)
引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数射线法 时间复杂度:O(n) 适用范围:任意多边形 个人认为是非常不错的算法(不需考虑精度误差和多边形点给出的顺序),可以作为第一选择 ...
- 判断是否qq或者微信内置浏览器
判断是否qq或者微信内置浏览器 *chrome wx,qq测试 ###安卓 QQ 内置浏览器 UA: Mozilla/5.0 (Linux; Android 5.0; SM-N9100 Build/L ...
最新文章
- LeetCode简单题之差的绝对值为 K 的数对数目
- [cocos2d-x]cocos2d和cocos2d-x的一些通用性
- 第十六届全国大学生智能车竞赛文化衫LOGO主图案设计
- Linux正确的关机方式
- 26.多线程join detach
- 在linux oracle 10g/11g x64bit环境中,goldengate随os启动而自己主动启动的脚本
- java关闭窗口函数_2016年将是Java终于拥有窗口函数的那一年!
- [LeetCode]Plus One
- L1-030 一帮一 (15 分)
- 访问 Notes/Domino 数据的定制 DXL 框架
- wps中的word删除空白页
- 163手机邮箱如何注册登陆?
- tp5使用RabbitMQ的使用记录
- 【饥荒脚本】饥荒控制台代码自动输入
- K均值 - 案例实现(python)
- 知识图谱架构(Knowledge Graph)
- 计算机基础知识英文,计算机基础知识英文版-基础并不好,在电脑上学英语,什么软件最好用? 爱问知识人...
- html如何实现日期下拉菜单,实现一个日期下拉菜单
- Firefox和IE浏览器清除缓存方法
- 餐饮公关无小事,从防微杜渐到危机处理都需要重视
热门文章
- 在 Windows Azure 上部署预配置 Oracle VM
- 佳能发售曝光对应的「IXY DIGITAL 3000 IS」
- leetcode 1223 python
- 动态规划——删除并获得点数(Leetcode 740)
- PAT乙级(1036 跟奥巴马一起编程)
- 中兴服务器raid配置_HP服务器RAID配置
- SCN风波又起,2019年6月之前Oracle必须升级吗?
- 安全预警:独立发布的Oracle严重 CVE-2018-3110 公告
- 阿里双11大促秒杀活动下的缓存技术与高水位限流实现
- 今儿直白的用盖房子为例,给你讲讲Java建造者模式