PEHDOMНу, и что это значит тогда? Что в модуле ошибка? Ты говоришь “это не маска”, модуль говорит “это маска”. Кто прав?
млин, это обратная маска, модуль понимает это
ipaddress.IPv4Network('192.168.0.1/0.0.0.240') IPv4Network('192.168.0.1/32')
py.user.nextО_о прямые только так, нет никаких “историческисложилось” есть четкое определения что такое маска подсети, она же прямая маска и зачем она нужна, и как она должна выглядеть.
Ну, это так устоялось просто исторически, но это не факт, что можно только так маски применять.
>>> ipaddress.IPv4Address(3232235521) IPv4Address('192.168.0.1')
PEHDOMМаска берёт своё название от битовой маски, а битовая маска происходит от слова маскировать. Так что то, что в ней должны идти единицы, а потом нули - это очень специфичное дополнение, связанное только с сетями, которые имели определённое историческое устройство.
О_о прямые только так, нет никаких “историческисложилось” есть четкое определения что такое маска подсети, она же прямая маска и зачем она нужна, и как она должна выглядеть.
PEHDOMТам в документации сказано, что 32-битное число можно подать в функцию формирования адреса, поэтому 0xc0a80001 вполне подходит. Ты же не думаешь, что адреса хранятся в виде 192.168.0.1 , они хранятся в 4-х байтах обычно для компактности, тогда как запись 192.168.0.1 занимает 11 байт.
значит ли это что 3232235521 это валидный ИП адрес?
py.user.nextну так ТС и писал
Так что то, что в ней должны идти единицы, а потом нули - это очень специфичное дополнение, связанное только с сетями, которые имели определённое историческое устройство.
alexbestalex
проверить корректность ввода маски подсети .
py.user.nextну я же писал что алгритм сложный, и нафиг не нужный, проще перевести в двоичную систему, а еще проще вобще создть кортеж, где перечислены все 33 возможные маски, много памяти это не займет, и потом просто проверять вхождение оператором in.
Вот этот код можно только дописать. Всё, что там уже есть, всё делается правильно. Для анализа последовательности битов надо использовать сдвиг в цикле без всяких рекурсий.
py.user.nextУгу я тоже умею читать документацию, там также сказано что ip_network прнимает в качестве аргумента через / или одно число которое явлеться к-вом байт в адресе сети(prefix), или строку ИП адреса, которая в дальнешем интерпретируеться как маска подсети если начинаеться с не нуля, или как маска хоста если начинаеться с нуля.
Там в документации сказано, что 32-битное число можно подать в функцию формирования адреса, поэтому 0xc0a80001 вполне подходит. Ты же не думаешь, что адреса хранятся в виде 192.168.0.1 , они хранятся в 4-х байтах обычно для компактности, тогда как запись 192.168.0.1 занимает 11 байт.
>>> ipaddress.IPv4Network('192.168.0.1/0.0.0.240') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.6/ipaddress.py", line 1531, in __init__ self.netmask, self._prefixlen = self._make_netmask(arg) File "/usr/lib/python3.6/ipaddress.py", line 1094, in _make_netmask prefixlen = cls._prefix_from_ip_string(arg) File "/usr/lib/python3.6/ipaddress.py", line 533, in _prefix_from_ip_string cls._report_invalid_netmask(ip_str) File "/usr/lib/python3.6/ipaddress.py", line 474, in _report_invalid_netmask raise NetmaskValueError(msg) from None ipaddress.NetmaskValueError: '0.0.0.240' is not a valid netmask
PEHDOM
Ты передаешь аргуметном маску хоста, и на основании того что ipaddress не выдал ошибку, утверждаешь что это маска сети.
PEHDOMТам, на самом деле, запутанная история. Наверное, ты прав, а в ipaddress ошибки всякие. Сейчас там в докстринге функции записано, что эти формы должны приниматься, но по факту они не принимаются.
выдает что твой пример не является маской.
class IPv4Network(_BaseV4, _BaseNetwork):
"""This class represents and manipulates 32-bit IPv4 network + addresses..
Attributes: [examples for IPv4Network('192.0.2.0/27')]
.network_address: IPv4Address('192.0.2.0')
.hostmask: IPv4Address('0.0.0.31')
.broadcast_address: IPv4Address('192.0.2.32')
.netmask: IPv4Address('255.255.255.224')
.prefixlen: 27
"""
# Class to use when creating address objects
_address_class = IPv4Address
def __init__(self, address, strict=True):
"""Instantiate a new IPv4 network object.
Args:
address: A string or integer representing the IP [& network].
'192.0.2.0/24'
'192.0.2.0/255.255.255.0'
'192.0.0.2/0.0.0.255'
are all functionally the same in IPv4. Similarly,
'192.0.2.1'
'192.0.2.1/255.255.255.255'
'192.0.2.1/32'
are also functionally equivalent. That is to say, failing to
provide a subnetmask will create an object with a mask of /32.
...
>>> import ipaddress >>> >>> ipaddress.IPv4Network('192.0.0.2/0.0.0.255') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/mnt/disk100a/guest/gitrepos/cpython/main/Lib/ipaddress.py", line 1536, in __init__ raise ValueError('%s has host bits set' % self) ValueError: 192.0.0.2/24 has host bits set >>>