Получить сетевой адрес, используя IP и маску. (php, IPv6) - PullRequest
1 голос
/ 15 апреля 2020

Как получить первый IP-адрес в сети (используя ipv6) (php) Пример:

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

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Начальный адрес сети вычисляется путем установки всех битов хоста маски на ноль. Другими словами, это простое побитовое И адреса и маски.

Используйте 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

1 голос
/ 15 апреля 2020

Я создал свой собственный класс IpUtils. Вы можете найти класс здесь . Это делает вашу задачу очень легко решаемой.

$ip = IpUtils::create('d7a:5949:11d0:bd9e:b2c1:6268:d889:de9b/48');
echo $ip->netAdr(); // d7a:5949:11d0::
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...