ОАК ЗВ - ip_network ???
П
Пирожок - L1D 14075 4C
Сделал такую программу на Питоне:
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]
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]
D
[ Dr. Andy ]
P.S. Файл:
парни, не качайте файл - там вирус
парни, не качайте файл - там вирус
К
Капитан Джек Дэниэлс
Почему в первом случае двоичное число имеет 32 бита
Вы чо в куда переводите?
Может вам изучить основы нетмаскинга?
Глянул код, не пишите больше, не ваше это
Г
Гватемала Лонг
Сделал такую программу на Питоне
Так Вам на форум животноводства надо, а не общение автоклуба.
П
Пирожок - L1D 14075 4C
парни, не качайте файл - там вирус
Если бы я мог в текстовый файл засунуть вирус, то вряд-ли задавал такой вопрос.
П
Пирожок - L1D 14075 4C
Вы чо в куда переводите?
Там написано чё и куда...
Это фрагменты ЕГЭшных задач.
Г
Гватемала Лонг
Где 32, там 17 символов. А где 31, там 16 символов.
П
Пирожок - L1D 14075 4C
Во втором случае ведущий ноль игнорируется.
M
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), которая дополняет строку нулями слева до желаемой длины.
Для решения этой проблемы, вам необходимо форматировать строку так, чтобы она дополнялась нулями слева до 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), которая дополняет строку нулями слева до желаемой длины.
M
Maple
чат гпт
П
Пирожок - L1D 14075 4C
Спасибо!
D
[ Dr. Andy ]
на Питоне
у мну питон 75 см
S
Shadoved_76
у мну питон 75 см
Детский питон. В зоопарке 5 метровый живет.
Авторизуйтесь, чтобы принять участие в дискуссии.