Мы вводим в командную строку ip адрес и маску подсети(Значение маски может быть в 16 виде ,в 8 виде, в 2 виде в зависимости от аргументов командной строки) .Вывести номер сети и номер узла.Пожалуйста помогите! Заранее благодарен.
Ответы
Відповідь:
Для начала необходимо преобразовать введенную маску подсети в формат "Десятичная точечная запись" (например, 255.255.255.0).Для этого можно использовать следующий код:
pythonCopy codeimport re def mask_to_cidr(mask): """Конвертирует маску подсети из формата A.B.C.D в CIDR-нотацию""" # Разделяем строку на 4 числа octets = mask.split('.') # Преобразуем каждый октет в двоичный формат binary_octets = [bin(int(octet))[2:].zfill(8) for octet inoctets] # Соединяем октеты и считаем количество единиц binary_mask = ''.join(binary_octets) cidr = str(len(binary_mask.rstrip('0'))) return cidr # Пример использования mask = '255.255.255.0' cidr = mask_to_cidr(mask) print(cidr) # 24
Теперь, когда у нас есть маска подсети в формате CIDR, мы можем вычислить номер сети и номер узла. Для этого необходимо выполнить следующие шаги:Разбить IP-адрес и маску подсети на октеты.Преобразовать каждый октет в двоичный формат.Соединить двоичные октеты IP-адреса и маски подсети.Определить количество бит, выделенных под номер сети и под номер узла.Разделить соединенные двоичные октеты на номер сети и номер узла.Преобразовать полученные двоичные значения в десятичный формат.Для выполнения этих шагов можно использовать следующий код:
pythonCopy codeimport re def mask_to_cidr(mask): """Конвертирует маску подсети из формата A.B.C.D в CIDR-нотацию""" # Разделяем строку на 4 числа octets = mask.split('.') # Преобразуем каждый октет в двоичный формат binary_octets = [bin(int(octet))[2:].zfill(8) for octet inoctets] # Соединяем октеты и считаем количество единиц binary_mask = ''.join(binary_octets) cidr = str(len(binary_mask.rstrip('0'))) return cidr defip_to_binary(ip): """Преобразует IP-адрес из формата A.B.C.D в двоичный формат""" # Разделяем строку на 4 числа octets = ip.split('.') # Преобразуем каждый октет в двоичный формат binary_octets = [bin(int(octet))[2:].zfill(8) for octet in octets] #