ТЕОРИЯ
Модуль ipaddress
В Python 3.3 появился модуль ipaddress
. С помощью него можно решать № 13 ЕГЭ.
Для решения № 13 нам потребуются функции ip_address()
и ip_network()
.
Создание IP-адреса
С помощью функции ip_address()
можно создать объект – IP-адрес. В качестве аргумента функции мы указываем строку, в которой записано значение IP-адреса.
from ipaddress import *
ip = ip_address('192.168.0.1')
print(ip)
Программа выводит
192.168.0.1
Обратите внимание, что функция ip_address()
возвращает не просто строку, а объект ipaddress.IPv4Address
.
Получение двоичной записи IP-адреса
В задачах ЕГЭ нам нужно получать двоичную запись IP-адреса. Есть два способа сделать это.
Способ № 1
Сначала переведём IP-адрес в десятичное число, а затем с помощью функции bin()
получим его двоичную запись.
1. Импортируем все функции из модуля ipaddress
и в переменной ip
создаём IP-адрес
from ipaddress import *
ip = ip_address('57.179.208.27')
2. С помощью функции int()
переводим IP-адрес в обычное десятичное число
from ipaddress import *
ip = ip_address('57.179.208.27')
ip_int = int(ip) # 968085531
3. Переводим полученное десятичное число в двоичную систему счисления с помощью функции bin()
from ipaddress import *
ip = ip_address('57.179.208.27')
ip_int = int(ip)
ip_2 = bin(ip_int)[2:] # '111001101100111101000000011011'
Не забываем с помощью среза удалить префикс 0b
, который приписывает функция bin()
.
4. Добавляем незначащие нули с помощью zfill()
, чтобы IP-адресс состоял из 32 двоичных цифр
from ipaddress import *
ip = ip_address('57.179.208.27')
ip_int = int(ip)
ip_2 = bin(ip_int)[2:] # '111001101100111101000000011011'
ip_2 = ip_2.zfill(32) # '00111001101100111101000000011011'
Таким образом мы получили двоичную запись IP-адреса, записанную в строку.
😎 Код можно записать в одну строку
from ipaddress import *
ip_2 = bin(int(ip_address('57.179.208.27')))[2:].zfill(32)
Способ № 2
❗ Данный способ работает только начиная с версии Python 3.9. Если вы не уверены на 100%, что нужная версия Python будет установлена у вас на ЕГЭ, то используйте первый способ.
1. Импортируем все функции из модуля ipaddress
и в переменной ip
создаём IP-адрес
from ipaddress import *
ip = ip_address('192.168.0.1')
2. С помощью f-строк получаем двоичную запись IP-адреса
from ipaddress import *
ip = ip_address('192.168.0.1')
ip_2 = f'{ip:b}' # 11000000101010000000000000000001
Обратите внимание, что в данном случае у нас не возникает префикса 0b
, поэтому его не надо удалять.
В данном способе дописывать незначащие нули с помощью zfill()
не нужно, так как они автоматически допишутся.
😎 Код можно записать в одну строку
from ipaddress import *
ip_2 = f'{ip_address("192.168.0.1"):b}'
Внешние и внутренние скобки должны отличаться!
Примечание
Перевод IP-адреса в число
У вас наверняка возник вопрос, как именно из IP-адреса получается обычное десятичное число.
from ipaddress import *
ip = ip_address('192.168.0.1')
ip_int = int(ip) # 3232235521
Переводим каждый байт IP-адреса 192.168.0.1
в двоичную запись: 11000000.10101000.00000000.00000001
.
И представляем это всё как одно двоичное число: 110000001010100000000000000000012.
И переводим данное двоичное число в десятичную систему счисления: 110000001010100000000000000000012 = 323223552110.

Ответ
224

Ответ
18

Ответ
14

Ответ
3

Ответ
510

Отве21

Ответ
224

Ответ
64

Ответ
6

Ответ
5

Ответ
13

Ответ
3003