Найти - Пользователи
Полная версия: Проверка корректности ввода маски подсети
Начало » Python для новичков » Проверка корректности ввода маски подсети
1 2
alexbestalex
Есть небольшая задача , проверить корректность ввода маски подсети .
Ни как не могу понять как это реализовать , можете подсказать ?
py.user.next
Используй регулярное выражение.
alexbestalex

py.user.next
Используй регулярное выражение.
То есть я пишу 255.255.255.0 - всё ок
Если пишу 255.255.0.255 - ошибка
Это всё можно сделать с помощью модуля re ?
py.user.next
alexbestalex
Это всё можно сделать с помощью модуля re ?
Через регулярное выражение ты проверяешь, что это вообще адрес (4 числа от 0 до 255), а потом в регулярном выражении у тебя есть группы, в которых и хранятся числа, ты их преобразываешь в целые и потом эти целые проверяешь на величину.

  
>>> import re
>>> 
>>> def test_ipmask(s):
...     pat = r'^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$'
...     match = re.search(pat, s)
...     if match is not None:
...         a, b, c, d = map(int, match.groups())
...         if (0 <= a <= 255 and
...             0 <= b <= 255 and
...             0 <= c <= 255 and
...             0 <= d <= 255):
...             return True
...     return False
... 
>>> test_ipmask('123.123.123.123')
True
>>> test_ipmask('123.1234.123.123')
False
>>>

Можешь и в этом модуле посмотреть конструктор подсети
python.org. ipaddress
Там можно отлавливать исключение, если маска сети неправильная.
PEHDOM
py.user.next
>>> test_ipmask('123.123.123.123')
True
да вы шутите? где вы такие маски видели?
Через регулярное выражение ты проверяешь, что это вообще адрес (4 числа от 0 до 255) тут все ОК.
дальше нужно проверить маску на валидность, проще всего перевсти числа в двоичную систему, и смотреть если у тебя идет “N единиц подряд потом 32-N нулей” или “все нули” или “все единицы” то это маска. Все остальное не маска.
Можно конечно тупо перебирать значения октетов,
Нужно рекурсивно смотреть примерно такой алгоритм:
1- й октет. 
Если октет в (0,128,192,224,240,248,252,254) :
смотрим остальные октеты.
Если хотябы один из остальных октетов больше 0:
это не маска.
Иначе :
это маска .
ИначеЕсли в первом октете 255:
GOTO "1- й октет" но только для второго октета.
Иначе :
это не маска
но ихо сложный алгоритм выходит проще перевсти в двоичную систему, и сразу видно маска это или нет.
py.user.next
PEHDOM
если у тебя идет N единиц подряд, потом 32-N нулей или все нули или все единицы то это маска. Все остальное не маска.



1- й октет. 
Если октет в (0,128,192,224,240,248,252,254) :
смотрим остальные октеты.
Если хотябы один из остальных октетов больше 0:
это не маска.
Иначе :
это маска .
ИначеЕсли в первом октете 255:
GOTO "1- й октет" но только для второго октета.
Иначе :
это не маска

  
>>> import ipaddress
>>> 
>>> ipaddress.IPv4Network('192.168.0.1/0.0.0.240')
IPv4Network('192.168.0.1/32')
>>> 
>>> bin(240)
'0b11110000'
>>>
PEHDOM
py.user.next
192.168.0.1/0.0.0.240
это обратная маска, или маска хоста.
192.168.0.1/32 означает что в маске 32 единицы подряд
это же азы
https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%81%D0%BA%D0%B0_%D0%BF%D0%BE%D0%B4%D1%81%D0%B5%D1%82%D0%B8
py.user.next
PEHDOM
это обратная маска, или маска хоста.
По твоему-то алгоритму получилось, что это не маска.
PEHDOM
py.user.next
По твоему-то алгоритму получилось, что это не маска.
так это и не маска подсети, что тут непраивльно?
Маска подсети это сплошные единицы, потом сплошные нули, или сплошные нули, или сплошные единицы
а 0.0.0.240 это что угодно, но не маска подсети
py.user.next
PEHDOM
так это и не маска подсети, что тут непраивльно?
Не видишь, что встроенный модуль пишет, что это маска?

Когда не маска, он пишет вон что
  
>>> ipaddress.IPv4Network('192.168.0.1/0.0.0.238')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.3/ipaddress.py", line 1443, in __init__
    % addr[1])
ipaddress.NetmaskValueError: '0.0.0.238' is not a valid netmask
>>>

PEHDOM
это же азы
Ну, это так устоялось просто исторически, но это не факт, что можно только так маски применять. Допустим, октет - да, он не может за пределами 0-255 значение иметь, а вот множество адресов вполне можно получить по любой маске. Просто исторически приняли, что она должна быть вот такой именно, так как сами сети определяются исторически определённым образом. Никогда не думал, почему выбрали именно 192.168? Почему выбрали именно эти числа? Ответа нет, просто исторически так сложилось.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB