Ещё примеры
Пример 1. Номер узла — через hostmask. Хостовая маска — это маска наоборот: единицы стоят там, где узел. Дальше обычное И.
i = ipaddress.ip_interface('192.168.1.130/255.255.255.192')
i.ip # 192.168.1.130 сам адрес узла
i.netmask # 255.255.255.192
i.hostmask # 0.0.0.63 маска НАОБОРОТ
i.network # 192.168.1.128/26
int(i.ip) & int(i.hostmask) # 2 -> номер узла
Пример 2. Перебор всех адресов сети. Объект сети можно пройти циклом — именно так решаются переборные задачи.
for addr in ipaddress.ip_network('10.0.0.4/30'):
print(addr)
# 10.0.0.4 адрес сети
# 10.0.0.5 узел
# 10.0.0.6 узел
# 10.0.0.7 broadcast
Обрати внимание: цикл выдаёт все адреса, включая служебные. Узлов здесь 4 − 2 = 2.
Пример 3. Биты и подсчёт единиц. Чтобы работать с битами, адрес переводят в число, а единицы считают через двоичную строку.
a = ipaddress.ip_address('192.168.1.130')
int(a) # 3232235906 32-битное число
bin(130).count('1') # 2 единиц в байте 130
bin(int(a) >> 16).count('1') # единиц в ЛЕВЫХ двух байтах
bin(int(a) & 0xFFFF).count('1') # единиц в ПРАВЫХ двух байтах