cidrToIPv6 static method
Returns the IPv6 ranges for the cidr.
Implementation
static List<String>? cidrToIPv6(String cidr) {
if (!cidr.contains('/')) return null;
final arr = cidr.split('/');
if (arr.length != 2 ||
!isIPv6(arr[0]) ||
!prefixPattern2.hasMatch(arr[1]) ||
int.parse(arr[1]) > 128) {
return null;
}
final prefix = int.parse(arr[1]);
final parts = expandIPv6(arr[0])!.split(':');
final bitStart = _repeat('1', prefix) + _repeat('0', 128 - prefix);
final bitEnd = _repeat('0', prefix) + _repeat('1', 128 - prefix);
final chunkSize = 16;
final floors = [
for (var i = 0; i < bitStart.length; i += chunkSize)
bitStart.substring(i, i + chunkSize),
];
final ceilings = [
for (var i = 0; i < bitEnd.length; i += chunkSize)
bitEnd.substring(i, i + chunkSize),
];
final startIP = <String>[];
final endIP = <String>[];
for (var x = 0; x < 8; x++) {
startIP.add(
(int.parse(parts[x], radix: 16) & int.parse(floors[x], radix: 2))
.toRadixString(16),
);
endIP.add(
(int.parse(parts[x], radix: 16) | int.parse(ceilings[x], radix: 2))
.toRadixString(16),
);
}
final hexStart = expandIPv6(_joinStrings(startIP, ':'))!;
final hexEnd = expandIPv6(_joinStrings(endIP, ':'))!;
return [hexStart, hexEnd];
}