Проверьте перекрытие CIDR в Java - PullRequest
0 голосов
/ 21 октября 2019

Наличие двух блоков CIDR - как я могу проверить в Java , что они не перекрываются? Я понял следующее решение, но я не уверен, что:

  • оно завершено,
  • это можно сделать без зависимости от внешней библиотеки,
  • это может бытьсделано более элегантным / эффективным способом.

В следующем коде используется SubnetUtils .

void isSubnetOverlap(String cidr1, String cidr2) {
    SubnetUtils.SubnetInfo subnetCidr = new SubnetUtils(cidr1).getInfo();
    SubnetUtils.SubnetInfo clusterCidr = new SubnetUtils(cidr2).getInfo();

    if (subnetCidr.isInRange(clusterCidr.getLowAddress())
            || subnetCidr.isInRange(clusterCidr.getHighAddress())
            || clusterCidr.isInRange(subnetCidr.getLowAddress())
            || clusterCidr.isInRange(subnetCidr.getHighAddress())) {

        // e.g. throw some exception
    }
}

1 Ответ

0 голосов
/ 22 октября 2019

Ваше решение работает;Вам не нужно проверять высокие адреса. Я бы не советовал писать собственное решение для чего-то, что уже работает, но проверить сеть как подсеть другой сети не сложно.

Просто используйте маску сети большей сети, чтобы увидеть, меньше лисеть является подмножеством большой сети.

Вот пример в java ...

String[] c1 = s1.split("/");
String[] c2 = s2.split("/");

if (c1.length != 2 || c2.length != 2) {

  throw new Exception("malformed cidr address" + " " + "(s1=" + s1
  + ", " + "s2=" + s2 + ")");
}

String[] a1 = c1[0].split("\\.");
String[] a2 = c2[0].split("\\.");

if (a1.length != 4 || a2.length != 4) {

  throw new Exception("malformed cidr address" + " " + "(s1=" + s1
  + ", " + "s2=" + s2 + ")");
}

int m1, m2;

try {

  m1 = Integer.parseInt(c1[1], 10);
  m2 = Integer.parseInt(c2[1], 10);

} catch (NumberFormatException ne) {

  throw new Exception("malformed cidr address" + " " + "(s1=" + s1
  + ", " + "s2=" + s2 + ")");
}

if ((m1 < 0) || (m1 > 32) || (m2 < 0) || (m2 > 32)) {

  throw new Exception("malformed cidr address" + " " + "(s1=" + s1
  + ", " + "s2=" + s2 + ")");
}

int i1 = 0, i2 = 0;

for (int i = 0; i < 4; i++) {

  try {

    int x1 = Integer.parseInt(a1[i], 10);
    int x2 = Integer.parseInt(a2[i], 10);

    if ((x1 < 0) || (x1 > 255) || (x2 < 0) || (x2 > 255)) {

      throw new Exception("malformed cidr address" + " " + "(s1=" + s1
      + ", " + "s2=" + s2 + ")");
    }

    i1 = i1 | (x1 << (24 - (i << 3)));
    i2 = i2 | (x2 << (24 - (i << 3)));

  } catch (NumberFormatException ne) {

    throw new Exception("malformed cidr address" + " " + "(s1=" + s1
    + ", " + "s2=" + s2 + ")");
  }
}

int l1 = (int) (((long)1 << (32 - m1)) - 1);
int l2 = (int) (((long)1 << (32 - m2)) - 1);

i1 = i1 & ~l1;
i2 = i2 & ~l2;

if ((i1 & ~l2) == i2 ||
    (i2 & ~l1) == i1)
  return true;

return false;

...