gpt4 book ai didi

php - 将 IPv6 地址与 CIDR 子网匹配

转载 作者:可可西里 更新时间:2023-11-01 12:41:52 28 4
gpt4 key购买 nike

是否有使用 CIDR 表示法将 IPv6 地址与 IPv6 子网匹配的好方法?我正在寻找的是与此等效的 IPv6: Matching an IP to a CIDR mask in PHP 5?

无法使用上面给出的示例,因为 IPv6 地址的长度为 128 位,导致按位左移无法正常工作。你能想到别的办法吗?

编辑:将我自己的解决方案添加到答案列表中。

最佳答案

由于您无法将 IPv6 地址转换为整数,因此您应该像这样操作位:

$ip='21DA:00D3:0000:2F3B:02AC:00FF:FE28:9C5A';
$cidrnet='21DA:00D3:0000:2F3B::/64';

// converts inet_pton output to string with bits
function inet_to_bits($inet)
{
$splitted = str_split($inet);
$binaryip = '';
foreach ($splitted as $char) {
$binaryip .= str_pad(decbin(ord($char)), 8, '0', STR_PAD_LEFT);
}
return $binaryip;
}

$ip = inet_pton($ip);
$binaryip=inet_to_bits($ip);

list($net,$maskbits)=explode('/',$cidrnet);
$net=inet_pton($net);
$binarynet=inet_to_bits($net);

$ip_net_bits=substr($binaryip,0,$maskbits);
$net_bits =substr($binarynet,0,$maskbits);

if($ip_net_bits!==$net_bits) echo 'Not in subnet';
else echo 'In subnet';

另外,如果你使用一些数据库来存储IP,它可能已经具备了比较它们的所有功能。例如,Postgres 有一个 inet 类型,可以确定 IP 是否包含在这样的子网中:

SELECT 
'21DA:00D3:0000:2F3B:02AC:00FF:FE28:9C5A'::inet <<
'21DA:00D3:0000:2F3B::/64'::inet;

9.11. Network Address Functions and Operators in PostgreSQL

关于php - 将 IPv6 地址与 CIDR 子网匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7951061/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com