ОАК ЗВ - ip_network ???

Сделал такую программу на Питоне:

from ipaddress import *

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 бит?
Что не так и как надо?
Спасибо.

P.S. Файл: https://disk.yandex.ru/d/2Z8haARriL6ZWw

[Сообщение изменено пользователем 20.02.2024 13:37]
0 / 10
[ Dr. Andy ]
От пользователя Пирожок - L1D 14075 4C
P.S. Файл: https://disk.yandex.ru/d/2Z8haARriL6ZWw

парни, не качайте файл - там вирус :ultra:
9 / 0
Капитан Джек Дэниэлс
От пользователя Пирожок - L1D 14075 4C
Почему в первом случае двоичное число имеет 32 бита

Вы чо в куда переводите?
Может вам изучить основы нетмаскинга?

Глянул код, не пишите больше, не ваше это
3 / 1
Гватемала Лонг
От пользователя Пирожок - L1D 14075 4C
Сделал такую программу на Питоне

Так Вам на форум животноводства надо, а не общение автоклуба.
9 / 1
Пирожок - L1D 14075 4C
От пользователя [ Dr. Andy ]
парни, не качайте файл - там вирус :ultra:


Если бы я мог в текстовый файл засунуть вирус, то вряд-ли задавал такой вопрос.
0 / 3
Пирожок - L1D 14075 4C
От пользователя Капитан Джек Дэниэлс
Вы чо в куда переводите?

Там написано чё и куда...

Это фрагменты ЕГЭшных задач.
0 / 4
Гватемала Лонг
Где 32, там 17 символов. А где 31, там 16 символов.
3 / 0
Пирожок - L1D 14075 4C
Во втором случае ведущий ноль игнорируется.
0 / 3
Maple
Проблема в вашем коде заключается в том, как функция 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), которая дополняет строку нулями слева до желаемой длины.
4 / 0
Maple
чат гпт
3 / 0
Пирожок - L1D 14075 4C
Спасибо!
0 / 2
[ Dr. Andy ]
От пользователя Пирожок - L1D 14075 4C
на Питоне

у мну питон 75 см :beach:
2 / 4
Shadoved_76
От пользователя [ Dr. Andy ]
у мну питон 75 см :beach:

Детский питон. В зоопарке 5 метровый живет.
5 / 4
Авторизуйтесь, чтобы принять участие в дискуссии.