Advertisement
ForestFox

OBS NEW

Feb 21st, 2022
718
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.61 KB | None | 0 0
  1. def check(mas):
  2.     mas = [str(mas[i]) for i in range(len(mas))]
  3.     if len(mas) == 4:
  4.         decimal, binary = 0, 0
  5.  
  6.         for i in range(len(mas)):
  7.             if not mas[i].isdigit():
  8.                 raise ValueError(f"В блоке {i + 1} введено не число")
  9.             if (mas[i].count("1") + mas[i].count("0")) == 8:
  10.                 binary += 1
  11.             elif 0 <= int(mas[i]) <= 255:
  12.                 decimal += 1
  13.                 mas[i] = int(mas[i])
  14.             else:
  15.                 raise ValueError(f"Число введенное в блоке {i + 1} неверное")
  16.  
  17.         if not (decimal == 4 or binary == 4):
  18.             raise ValueError(f"Числа в блоках в разных системах счисления")
  19.     else:
  20.         raise ValueError("Неправильный ввод - IP состоит из 4 блоков")
  21.     return True
  22.  
  23.  
  24. def is_binary(mas):
  25.     return len(str(mas[0])) == 8
  26.  
  27.  
  28. def transform(mas):
  29.     new = []
  30.     if check(mas):
  31.         if is_binary(mas):
  32.             for i in mas:
  33.                 if len(i) == 8:
  34.                     new += [int(i, 2)]
  35.         else:
  36.             for i in mas:
  37.                 j = bin(int(i))[2:]
  38.                 new += [(8 - len(j)) * "0" + j]
  39.  
  40.     return new
  41.  
  42.  
  43. def what_ip_class(mas):
  44.     if is_binary(mas):
  45.         mas = transform(mas)
  46.  
  47.     if mas[0] < 128:
  48.         return 'A'
  49.     elif mas[0] < 192:
  50.         return 'B'
  51.     elif mas[0] < 224:
  52.         return 'C'
  53.     elif mas[0] < 240:
  54.         return 'D'
  55.     elif mas[0] < 256:
  56.         return 'E'
  57.  
  58.  
  59. def step(k):
  60.     n = k
  61.     dv = 0
  62.     while n > 0:
  63.         n //= 2
  64.         dv += 1
  65.     return dv
  66.  
  67.  
  68. def mask(mas, pod_set=0):
  69.     step_pod_set = step(pod_set)
  70.     cl = what_ip_class(mas)
  71.     new = ['0' * 8 for i in range(4)]
  72.     octet = ord(cl) - ord('A') + 1
  73.     for i in range(octet):
  74.         new[i] = '1' * 8
  75.     for i in range(octet, 4):
  76.         if step_pod_set == 0:
  77.             break
  78.         new[i] = step_pod_set * '1' + (8 - step_pod_set) * '0'
  79.         step_pod_set //= 8
  80.     return transform(new)
  81.  
  82.  
  83. def start_and_end(mas):
  84.     cl = what_ip_class(mas)
  85.     start = [0 for i in range(4)]
  86.     end = [255 for i in range(4)]
  87.     octet = ord(cl) - ord('A') + 1
  88.     for i in range(octet):
  89.         start[i] = mas[i]
  90.         end[i] = mas[i]
  91.     start[-1] = 1
  92.     end[-1] = 254
  93.     return start, end
  94.  
  95.  
  96. def adreses5(mas):
  97.     start, end = start_and_end(mas)
  98.     first_5 = [start[:3] + [start[-1] + i] for i in range(5)]
  99.     last_of_us = [end[:3] + [end[-1] - i] for i in range(5)]
  100.     return first_5, last_of_us
  101.  
  102.  
  103. def number_ip(mas, pod_set):
  104.     cl = what_ip_class(mas)
  105.     octet = ord(cl) - ord('A') + 1
  106.     return 2 ** (8 * (4 - octet)), 2 ** (8 * (4 - octet)) - pod_set * 2
  107.  
  108.  
  109. def norm_int(mas):
  110.     new = []
  111.     for i in mas:
  112.         new += [int(i)]
  113.     return new
  114.  
  115.  
  116. def inp():
  117.     print('Введите адрес сети')
  118.     ad = list(map(str, input().split(".")))
  119.     print('''Введите номер задания 4, 5 или 6''')
  120.     number = int(input())
  121.     pod_set, hosts = 0, 0
  122.     if number == 6:
  123.         print('Введите количество подсетей и хостов через пробел')
  124.         pod_set, hosts = map(int, input().split())
  125.         return ad, number, pod_set, hosts
  126.     if number not in (4, 5, 6):
  127.         raise ValueError('Введен неправильный номер задания')
  128.     return ad, number, pod_set, hosts
  129.  
  130.  
  131. def possibly(ad, c_p, c_h):
  132.     cl = what_ip_class(ad)
  133.     octet = 3 - ord(cl) + ord('A')
  134.     return step(c_h) + step(c_p) <= octet * 8
  135.  
  136.  
  137. def main(ad, number, pod_set, hosts):
  138.     if check(ad):
  139.         if number == 4:
  140.             return transform(ad)
  141.         elif number == 5 or number == 6:
  142.             if is_binary(ad):
  143.                 ad = transform(ad)
  144.             ad = norm_int(ad)
  145.             if what_ip_class(ad) in 'DE':
  146.                 return f'''Class: {what_ip_class(ad)}'''
  147.             if number == 5:
  148.                 return f'''Class: {what_ip_class(ad)}\nStart: {start_and_end(ad)[0]}\nEnd: {start_and_end(ad)[1]}\nMask: {mask(ad)}'''
  149.             elif number == 6:
  150.                 if possibly(ad, pod_set, hosts):
  151.                     return f'''Mask: {mask(ad, pod_set)}\nClass: {what_ip_class(ad)}\nStart: {start_and_end(ad)[0]}\nEnd: {start_and_end(ad)[1]}\nNumber IP: {number_ip(ad, pod_set)[0]}\nNumber IP for hosts: {number_ip(ad, pod_set)[1]}\nFirst 5: {adreses5(ad)[0]}\nLast of us: {adreses5(ad)[1]}'''
  152.  
  153.  
  154. if __name__ == '__main__':
  155.     ad, number, pod_set, hosts = inp()
  156.     print(main(ad, number, pod_set, hosts))
  157.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement