使用 ip 和掩码获取网络地址。 (php, IPv6)

Get network address using ip and mask. (php, IPv6)

如何获取网络的第一个ip地址(使用ipv6)(php) 示例:

input - d7a:5949:11d0:bd9e:b2c1:6268:d889:de9b / 48
output- d7a:5949:11d0::

我已经创建了自己的 class IpUtils。你可以找到 class here。这使您的任务非常容易解决。

$ip = IpUtils::create('d7a:5949:11d0:bd9e:b2c1:6268:d889:de9b/48');
echo $ip->netAdr(); // d7a:5949:11d0::

网络的起始地址是通过将掩码的所有主机位设置为零来计算的。换句话说,它是地址和掩码的简单按位与运算。

使用inet_pton解析IP地址。标准库中没有生成二进制网络掩码的函数,所以你必须自己写一个:

<?php

function mask(int $bits, int $ones): string
{
    $m = "";

    for ($i = 0; $i < $bits/8; $i++) {
        if ($ones >= 8) {
            $m .= chr(0xff);
            $ones -= 8;
        } else {
            $m .= chr(~(0xff >> $ones));
            $ones = 0;
        }
    }

    return $m;
}

$addr = inet_pton("d7a:5949:11d0:bd9e:b2c1:6268:d889:de9b");
$mask = mask(128, 48);

$start = $addr & $mask;

echo inet_ntop($start), "\n"; // d7a:5949:11d0::

在 3v4l.org 上试用:https://3v4l.org/hrD6a