Рассчитать и преобразовать IPv6-адрес на основе префикса CIDR

У меня есть IPv6-адрес с префиксом CIDR. Ex: 2001:0:3238:DFE1:0063::FEFB/32

Я ищу написать такую ​​функцию, что адрес IPv6 преобразуется в соответствии с количеством битов в предоставленном префиксе CIDR. Это означает, что если указан префикс 32, IP-адрес должен содержать 32 бита, начиная с левого, а остальные должны быть равны нулю. В приведенном выше примере желаемый результат должен быть:

2001:0000:0000:0000:0000:0000:0000:0000/32

У меня есть другие функции для быстрого доступа к нужному IP, как это 2001::/32

Префикс CIDR может варьироваться от 0 до 128.

Это то, что я до сих пор, основываясь на этом посте Вот, но я не уверен, дает ли это желаемый результат. Может кто-то посмотреть на это и помочь? Я думаю прямо о CIDR представлении здесь?

public function getCIDRMatchedIP( $ipAddress )
{
// Split in address and prefix length
list($firstaddrstr, $prefixlen) = explode('/', $ipAddress);

// Parse the address into a binary string
$firstaddrbin = inet_pton($firstaddrstr);

// Convert the binary string to a string with hexadecimal characters
# unpack() can be replaced with bin2hex()
# unpack() is used for symmetry with pack() below
$firstaddrhex = reset(unpack('H*', $firstaddrbin));

// Overwriting first address string to make sure notation is optimal
$firstaddrstr = inet_ntop($firstaddrbin);

$cidrMatchedString = $firstaddrstr.'/'.$prefixlen;

echo $cidrMatchedString;
}

1

Решение

Вот :

function getCIDRMatchedIP($ip)
{
if (strpos($ip, "::") !== false) {
$parts = explode(":", $ip);

$cnt = 0;
// Count number of parts with a number in it
for ($i = 0; $i < count($parts); $i++) {
if (is_numeric("0x" . $parts[$i]))
$cnt++;
}
// This is how many 0000 blocks is needed
$needed = 8 - $cnt;
$ip = str_replace("::", str_repeat(":0000", $needed), $ip);
}

list($ip, $prefix_len) = explode('/', $ip);
$parts = explode(":", $ip);

// This is the start bit mask
$bstring = str_repeat("1", $prefix_len) . str_repeat("0", 128 - $prefix_len);
$mins = str_split($bstring, 16);

$start = array();

for ($i = 0; $i < 8; $i++) {
$min = base_convert($mins[$i], 2, 16);
$start[] = sprintf("%04s", dechex(hexdec($parts[$i]) & hexdec($min)));
}

$start = implode(':', $start);

return $start . '/' . $prefix_len;
}

И вы вызываете функцию getCIDRMatchedIP :

echo getCIDRMatchedIP('2001:0:3238:DFE1:0063::FEFB/32');
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]