【问题标题】:Get network address using ip and mask. (php, IPv6)使用 ip 和掩码获取网络地址。 (php, IPv6)
【发布时间】:2020-04-15 12:12:57
【问题描述】:

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

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

【问题讨论】:

    标签: php ipv6


    【解决方案1】:

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

    使用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

    【讨论】:

    • 我忘记在掩码函数中限制$ones。我更新了答案。
    • @Peter- 谢谢!
    【解决方案2】:

    我创建了自己的 IpUtils 类。您可以找到课程here。这使您的任务很容易解决。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      • 2013-03-03
      相关资源
      最近更新 更多