liartie

Untitled

Oct 4th, 2022
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.89 KB | None | 0 0
  1. namespace Task1
  2. {
  3. // Необходимо заменить на более подходящий тип (коллекцию), позволяющий
  4. // эффективно искать диапазон по заданному IP-адресу
  5. using IPRangesDatabase = List<Tuple<String, String>>;
  6.  
  7. public class Task1
  8. {
  9. /*
  10. * Объекты этого класса создаются из строки, но хранят внутри помимо строки
  11. * ещё и целочисленное значение соответствующего адреса. Например, для адреса
  12. * 127.0.0.1 должно храниться число 1 + 0 * 2^8 + 0 * 2^16 + 127 * 2^24 = 2130706433.
  13. */
  14. internal record IPv4Addr (string StrValue) : IComparable<IPv4Addr>
  15. {
  16. internal uint IntValue = Ipstr2Int(StrValue);
  17.  
  18. private static uint Ipstr2Int(string strValue)
  19. {
  20. const uint p8 = 256;
  21. const uint p16 = 65536;
  22. const uint p24 = 16777216;
  23. var split = strValue.Split(".");
  24. uint ans = 0;
  25. ans += Convert.ToUInt32(split[0]) * p24;
  26. ans += Convert.ToUInt32(split[1]) * p16;
  27. ans += Convert.ToUInt32(split[2]) * p8;
  28. ans += Convert.ToUInt32(split[3]);
  29.  
  30. return ans;
  31. }
  32.  
  33. // Благодаря этому методу мы можем сравнивать два значения IPv4Addr
  34. public int CompareTo(IPv4Addr other)
  35. {
  36. return IntValue.CompareTo(other.IntValue);
  37. }
  38.  
  39. public override string ToString()
  40. {
  41. return StrValue;
  42. }
  43. }
  44.  
  45. internal record class IPRange(IPv4Addr IpFrom, IPv4Addr IpTo)
  46. {
  47. public override string ToString()
  48. {
  49. return $"{IpFrom},{IpTo}";
  50. }
  51. }
  52.  
  53. internal record class IPLookupArgs(string IpsFile, List<string> IprsFiles);
  54.  
  55. internal static IPLookupArgs? ParseArgs(string[] args)
  56. {
  57. if (args.Length <= 1)
  58. {
  59. return null;
  60. }
  61.  
  62. string ipsFile = args[0];
  63. List<String> iprsFiles = new List<string>();
  64. for (int i = 1; i < args.Length; i++)
  65. {
  66. iprsFiles.Add(args[i]);
  67. }
  68. IPLookupArgs ipArgs = new IPLookupArgs(ipsFile, iprsFiles);
  69. return ipArgs;
  70. }
  71.  
  72. internal static List<string> LoadQuery(string filename)
  73. {
  74. List<String> lines = new List<string>();
  75. foreach (string line in File.ReadLines(filename))
  76. {
  77. lines.Add(line);
  78. }
  79.  
  80. return lines;
  81. }
  82.  
  83. internal static IPRangesDatabase LoadRanges(List<String> filenames)
  84. {
  85. IPRangesDatabase range = new IPRangesDatabase();
  86. foreach (var filename in filenames)
  87. {
  88. foreach (string line in File.ReadLines(filename))
  89. {
  90. var currentRange = line.Split(",");
  91. Tuple<String, String> r = new Tuple<string, string>(currentRange[0], currentRange[1]);
  92. range.Add(r);
  93. }
  94. }
  95.  
  96. return range;
  97. }
  98.  
  99. internal static IPRange? FindRange(IPRangesDatabase ranges, IPv4Addr query) {
  100. foreach (var range in ranges)
  101. {
  102. IPv4Addr l = new IPv4Addr(range.Item1);
  103. IPv4Addr r = new IPv4Addr(range.Item2);
  104. uint left = l.IntValue;
  105. uint right = r.IntValue;
  106. if (query.IntValue >= left && query.IntValue <= right)
  107. {
  108. return new IPRange(l, r);
  109. }
  110. }
  111. return null;
  112. }
  113.  
  114. public static void Main(string[] args)
  115. {
  116. var ipLookupArgs = ParseArgs(args);
  117. if (ipLookupArgs == null)
  118. {
  119. return;
  120. }
  121.  
  122. var queries = LoadQuery(ipLookupArgs.IpsFile);
  123. var ranges = LoadRanges(ipLookupArgs.IprsFiles);
  124. foreach (var ip in queries)
  125. {
  126. var findRange = FindRange(ranges, new IPv4Addr(ip));
  127. if (findRange != null)
  128. {
  129. var result = findRange.IpFrom + " " + findRange.IpTo;
  130. Console.WriteLine($"{ip}: {result}");
  131. }
  132. }
  133. }
  134.  
  135. private static T TODO<T>()
  136. {
  137. throw new NotImplementedException();
  138. }
  139. }
  140. }
Advertisement
Add Comment
Please, Sign In to add comment