У меня есть 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;
}
Вот :
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');
Других решений пока нет …