Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def check(mas):
- mas = [str(mas[i]) for i in range(len(mas))]
- if len(mas) == 4:
- decimal, binary = 0, 0
- for i in range(len(mas)):
- if not mas[i].isdigit():
- raise ValueError(f"В блоке {i + 1} введено не число")
- if (mas[i].count("1") + mas[i].count("0")) == 8:
- binary += 1
- elif 0 <= int(mas[i]) <= 255:
- decimal += 1
- mas[i] = int(mas[i])
- else:
- raise ValueError(f"Число введенное в блоке {i + 1} неверное")
- if not (decimal == 4 or binary == 4):
- raise ValueError(f"Числа в блоках в разных системах счисления")
- else:
- raise ValueError("Неправильный ввод - IP состоит из 4 блоков")
- return True
- def is_binary(mas):
- return len(str(mas[0])) == 8
- def transform(mas):
- new = []
- if check(mas):
- if is_binary(mas):
- for i in mas:
- if len(i) == 8:
- new += [int(i, 2)]
- else:
- for i in mas:
- j = bin(int(i))[2:]
- new += [(8 - len(j)) * "0" + j]
- return new
- def what_ip_class(mas):
- if is_binary(mas):
- mas = transform(mas)
- if mas[0] < 128:
- return 'A'
- elif mas[0] < 192:
- return 'B'
- elif mas[0] < 224:
- return 'C'
- elif mas[0] < 240:
- return 'D'
- elif mas[0] < 256:
- return 'E'
- def step(k):
- n = k
- dv = 0
- while n > 0:
- n //= 2
- dv += 1
- return dv
- def mask(mas, pod_set=0):
- step_pod_set = step(pod_set)
- cl = what_ip_class(mas)
- new = ['0' * 8 for i in range(4)]
- octet = ord(cl) - ord('A') + 1
- for i in range(octet):
- new[i] = '1' * 8
- for i in range(octet, 4):
- if step_pod_set == 0:
- break
- new[i] = step_pod_set * '1' + (8 - step_pod_set) * '0'
- step_pod_set //= 8
- return transform(new)
- def start_and_end(mas):
- cl = what_ip_class(mas)
- start = [0 for i in range(4)]
- end = [255 for i in range(4)]
- octet = ord(cl) - ord('A') + 1
- for i in range(octet):
- start[i] = mas[i]
- end[i] = mas[i]
- start[-1] = 1
- end[-1] = 254
- return start, end
- def adreses5(mas):
- start, end = start_and_end(mas)
- first_5 = [start[:3] + [start[-1] + i] for i in range(5)]
- last_of_us = [end[:3] + [end[-1] - i] for i in range(5)]
- return first_5, last_of_us
- def number_ip(mas, pod_set):
- cl = what_ip_class(mas)
- octet = ord(cl) - ord('A') + 1
- return 2 ** (8 * (4 - octet)), 2 ** (8 * (4 - octet)) - pod_set * 2
- def norm_int(mas):
- new = []
- for i in mas:
- new += [int(i)]
- return new
- def inp():
- print('Введите адрес сети')
- ad = list(map(str, input().split(".")))
- print('''Введите номер задания 4, 5 или 6''')
- number = int(input())
- pod_set, hosts = 0, 0
- if number == 6:
- print('Введите количество подсетей и хостов через пробел')
- pod_set, hosts = map(int, input().split())
- return ad, number, pod_set, hosts
- if number not in (4, 5, 6):
- raise ValueError('Введен неправильный номер задания')
- return ad, number, pod_set, hosts
- def possibly(ad, c_p, c_h):
- cl = what_ip_class(ad)
- octet = 3 - ord(cl) + ord('A')
- return step(c_h) + step(c_p) <= octet * 8
- def main(ad, number, pod_set, hosts):
- if check(ad):
- if number == 4:
- return transform(ad)
- elif number == 5 or number == 6:
- if is_binary(ad):
- ad = transform(ad)
- ad = norm_int(ad)
- if what_ip_class(ad) in 'DE':
- return f'''Class: {what_ip_class(ad)}'''
- if number == 5:
- return f'''Class: {what_ip_class(ad)}\nStart: {start_and_end(ad)[0]}\nEnd: {start_and_end(ad)[1]}\nMask: {mask(ad)}'''
- elif number == 6:
- if possibly(ad, pod_set, hosts):
- 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]}'''
- if __name__ == '__main__':
- ad, number, pod_set, hosts = inp()
- print(main(ad, number, pod_set, hosts))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement