Алгоритм для вычитания одного диапазона IP из другого - C#
Формулировка задачи:
Есть два файла с диапазонами IP адресов вида:
2.60.0.0-2.60.2.255
2.60.4.0-2.60.8.255
2.60.10.0-2.60.10.255
2.60.13.0-2.60.13.255
Нужно сформировать третий диапазон. Из первого файла original.txt исключить диапазоны из файла subtract.txt
Я уже голову себе сломал. Ничего умнее, чем решать "в лоб" придумать не могу. А это - найти все IP из диапазонов первого файла, найти все IP из диапазонов второго файла, выкинуть лишнее. А потом снова как-то привести к диапазонам
Ещё нашёл такую штуку:
http://ipnetwork.codeplex.com/
Работает так:
И есть у этого класса разные прикольные методы. Но ничего подходящего я найти всё равно не смог. Впрочем у меня диапазоны для "вычитания" и в этом формате. Файл - subtractRanges.txt
Посоветуйте, что делать с этой проблемой.
IPNetwork ipnetwork = IPNetwork.Parse("192.168.168.100/24");
Console.WriteLine("Network : {0}", ipnetwork.Network);
Console.WriteLine("Netmask : {0}", ipnetwork.Netmask);
Console.WriteLine("Broadcast : {0}", ipnetwork.Broadcast);
Console.WriteLine("FirstUsable : {0}", ipnetwork.FirstUsable);
Console.WriteLine("LastUsable : {0}", ipnetwork.LastUsable);
Console.WriteLine("Usable : {0}", ipnetwork.Usable);
Console.WriteLine("Cidr : {0}", ipnetwork.Cidr);Решение задачи: «Алгоритм для вычитания одного диапазона IP из другого»
textual
Листинг программы
bool excluded;
foreach (string origItem in orig) {
ipOrig = IPRange.Parse(origItem);
excluded = false;
foreach (string subtractItem in subtract) {
ipSub = IPRange.Parse(subtractItem);
IPRange[] res = ipOrig.Exclude(ipSub);
if (res.Length > 0) {
sw.WriteLine(res[0].ToString());
sw.WriteLine(res[1].ToString());
Console.WriteLine(res[0].ToString());
Console.WriteLine(res[1].ToString());
excluded = true;
}
}
if (!excluded) {
sw.WriteLine(ipOrig.ToString());
Console.WriteLine(ipOrig.ToString());
}
}