net = ip_network(f'142.108.56.118/255.255.255.240',strict=False)
for ip in net:
ip_2 = bin(int(ip))[2:]
print('net =', net, 'ip_2 =', ip_2 , 'n = ', len(str(ip_2)))
net
= ip_network(f'116.29.170.89/255.255.255.224',strict=False)
for ip in net:
ip_2 = bin(int(ip))[2:]
print('net =', net, 'ip_2 =', ip_2 , 'n = ', len(str(ip_2)))
Результат работы: net = 142.108.56.112/28 ip_2 = 10001110011011000011100001111111 n =
32
net = 116.29.170.64/27 ip_2 = 1110100000111011010101001011111 n = 31
Почему в первом случае двоичное число имеет 32 бита (и это правильно), а во втором - 31 бит?
Что не так и как надо?
Спасибо.
Проблема в вашем коде заключается в том, как функция bin() возвращает двоичное представление числа. Функция bin() возвращает строку, которая начинается с префикса '0b', обозначающего двоичное число, и потом следует само двоичное число. Однако, если старшие биты числа являются нулями, они не будут
отображаться в строке, что приводит к тому, что старшие нули будут отсечены и строка будет содержать меньше символов, чем полное 32-битное представление.
Для решения этой проблемы, вам необходимо форматировать строку так, чтобы она дополнялась нулями слева до 32 символов. В Python это
можно сделать с помощью метода str.zfill() или форматирования строк с помощью метода format().
Вот исправленная версия вашего кода, в которой используется метод format() для гарантии, что двоичное число будет иметь ровно 32 бита:
```python
from ipaddress import
ip_network
net = ip_network(f'142.108.56.118/255.255.255.240', strict=False)
for ip in net:
ip_2 = bin(int(ip))[2:].zfill(32)
print('net =', net, 'ip_2 =', ip_2, 'n = ', len(ip_2))
net = ip_network(f'116.29.170.89/255.255.255.224',
strict=False)
for ip in net:
ip_2 = bin(int(ip))[2:].zfill(32)
print('net =', net, 'ip_2 =', ip_2, 'n = ', len(ip_2))
```
Теперь, независимо от того, какое значение имеет IP-адрес, двоичное представление всегда будет иметь длину в 32 символа за счет
использования zfill(32), которая дополняет строку нулями слева до желаемой длины.
Внимание! сейчас Вы не авторизованы и не можете подавать сообщения как зарегистрированный пользователь.
Чтобы авторизоваться, нажмите на эту ссылку (после авторизации вы вернетесь на
эту же страницу)