Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- namespace Task1
- {
- // Необходимо заменить на более подходящий тип (коллекцию), позволяющий
- // эффективно искать диапазон по заданному IP-адресу
- using IPRangesDatabase = List<Tuple<String, String>>;
- public class Task1
- {
- /*
- * Объекты этого класса создаются из строки, но хранят внутри помимо строки
- * ещё и целочисленное значение соответствующего адреса. Например, для адреса
- * 127.0.0.1 должно храниться число 1 + 0 * 2^8 + 0 * 2^16 + 127 * 2^24 = 2130706433.
- */
- internal record IPv4Addr (string StrValue) : IComparable<IPv4Addr>
- {
- internal uint IntValue = Ipstr2Int(StrValue);
- private static uint Ipstr2Int(string strValue)
- {
- const uint p8 = 256;
- const uint p16 = 65536;
- const uint p24 = 16777216;
- var split = strValue.Split(".");
- uint ans = 0;
- ans += Convert.ToUInt32(split[0]) * p24;
- ans += Convert.ToUInt32(split[1]) * p16;
- ans += Convert.ToUInt32(split[2]) * p8;
- ans += Convert.ToUInt32(split[3]);
- return ans;
- }
- // Благодаря этому методу мы можем сравнивать два значения IPv4Addr
- public int CompareTo(IPv4Addr other)
- {
- return IntValue.CompareTo(other.IntValue);
- }
- public override string ToString()
- {
- return StrValue;
- }
- }
- internal record class IPRange(IPv4Addr IpFrom, IPv4Addr IpTo)
- {
- public override string ToString()
- {
- return $"{IpFrom},{IpTo}";
- }
- }
- internal record class IPLookupArgs(string IpsFile, List<string> IprsFiles);
- internal static IPLookupArgs? ParseArgs(string[] args)
- {
- if (args.Length <= 1)
- {
- return null;
- }
- string ipsFile = args[0];
- List<String> iprsFiles = new List<string>();
- for (int i = 1; i < args.Length; i++)
- {
- iprsFiles.Add(args[i]);
- }
- IPLookupArgs ipArgs = new IPLookupArgs(ipsFile, iprsFiles);
- return ipArgs;
- }
- internal static List<string> LoadQuery(string filename)
- {
- List<String> lines = new List<string>();
- foreach (string line in File.ReadLines(filename))
- {
- lines.Add(line);
- }
- return lines;
- }
- internal static IPRangesDatabase LoadRanges(List<String> filenames)
- {
- IPRangesDatabase range = new IPRangesDatabase();
- foreach (var filename in filenames)
- {
- foreach (string line in File.ReadLines(filename))
- {
- var currentRange = line.Split(",");
- Tuple<String, String> r = new Tuple<string, string>(currentRange[0], currentRange[1]);
- range.Add(r);
- }
- }
- return range;
- }
- internal static IPRange? FindRange(IPRangesDatabase ranges, IPv4Addr query) {
- foreach (var range in ranges)
- {
- IPv4Addr l = new IPv4Addr(range.Item1);
- IPv4Addr r = new IPv4Addr(range.Item2);
- uint left = l.IntValue;
- uint right = r.IntValue;
- if (query.IntValue >= left && query.IntValue <= right)
- {
- return new IPRange(l, r);
- }
- }
- return null;
- }
- public static void Main(string[] args)
- {
- var ipLookupArgs = ParseArgs(args);
- if (ipLookupArgs == null)
- {
- return;
- }
- var queries = LoadQuery(ipLookupArgs.IpsFile);
- var ranges = LoadRanges(ipLookupArgs.IprsFiles);
- foreach (var ip in queries)
- {
- var findRange = FindRange(ranges, new IPv4Addr(ip));
- if (findRange != null)
- {
- var result = findRange.IpFrom + " " + findRange.IpTo;
- Console.WriteLine($"{ip}: {result}");
- }
- }
- }
- private static T TODO<T>()
- {
- throw new NotImplementedException();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment