ipv4ToCidr static method

List<String>? ipv4ToCidr(
  1. String ipFrom,
  2. String ipTo
)

Returns the CIDR for the IPv4 range between ipFrom and ipTo.

Implementation

static List<String>? ipv4ToCidr(String ipFrom, String ipTo) {
  if (!isIPv4(ipFrom) || !isIPv4(ipTo)) return null;
  var startIP = ipv4ToDecimal(ipFrom)!.toInt();
  var endIP = ipv4ToDecimal(ipTo)!.toInt();
  List<String> result = [];

  while (endIP >= startIP) {
    var maxSize = 32;
    while (maxSize > 0) {
      final mask = (pow(2, 32) - pow(2, 32 - (maxSize - 1))).toInt();
      if ((startIP & mask) != startIP) break;
      maxSize--;
    }
    final x = log(endIP - startIP + 1) / log(2);
    final maxDiff = 32 - x.floor();
    if (maxSize < maxDiff) maxSize = maxDiff.toInt();
    result.add('${decimalToIPv4(BigInt.from(startIP))}/$maxSize');
    startIP += pow(2, 32 - maxSize).toInt();
  }
  return result;
}