Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 8, 2017 13:52:43

alexbestalex
Зарегистрирован: 2017-04-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка корректности ввода маски подсети

Есть небольшая задача , проверить корректность ввода маски подсети .
Ни как не могу понять как это реализовать , можете подсказать ?

Офлайн

#2 Апрель 8, 2017 14:16:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9999
Репутация: +  857  -
Профиль   Отправить e-mail  

Проверка корректности ввода маски подсети

Используй регулярное выражение.



Офлайн

#3 Апрель 8, 2017 16:02:45

alexbestalex
Зарегистрирован: 2017-04-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка корректности ввода маски подсети


py.user.next
Используй регулярное выражение.
То есть я пишу 255.255.255.0 - всё ок
Если пишу 255.255.0.255 - ошибка
Это всё можно сделать с помощью модуля re ?

Офлайн

#4 Апрель 8, 2017 16:14:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9999
Репутация: +  857  -
Профиль   Отправить e-mail  

Проверка корректности ввода маски подсети

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
Там можно отлавливать исключение, если маска сети неправильная.



Офлайн

#5 Апрель 8, 2017 16:59:04

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Проверка корректности ввода маски подсети

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- й октет" но только для второго октета.
Иначе :
это не маска
но ихо сложный алгоритм выходит проще перевсти в двоичную систему, и сразу видно маска это или нет.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Апрель 8, 2017 17:22:18)

Офлайн

#6 Апрель 8, 2017 17:21:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9999
Репутация: +  857  -
Профиль   Отправить e-mail  

Проверка корректности ввода маски подсети

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'
>>>



Отредактировано py.user.next (Апрель 8, 2017 17:26:24)

Офлайн

#7 Апрель 8, 2017 17:25:45

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Проверка корректности ввода маски подсети

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



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#8 Апрель 8, 2017 17:28:05

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9999
Репутация: +  857  -
Профиль   Отправить e-mail  

Проверка корректности ввода маски подсети

PEHDOM
это обратная маска, или маска хоста.
По твоему-то алгоритму получилось, что это не маска.



Офлайн

#9 Апрель 8, 2017 17:37:19

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Проверка корректности ввода маски подсети

py.user.next
По твоему-то алгоритму получилось, что это не маска.
так это и не маска подсети, что тут непраивльно?
Маска подсети это сплошные единицы, потом сплошные нули, или сплошные нули, или сплошные единицы
а 0.0.0.240 это что угодно, но не маска подсети



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Апрель 8, 2017 17:37:48)

Офлайн

#10 Апрель 8, 2017 17:39:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9999
Репутация: +  857  -
Профиль   Отправить e-mail  

Проверка корректности ввода маски подсети

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? Почему выбрали именно эти числа? Ответа нет, просто исторически так сложилось.



Отредактировано py.user.next (Апрель 8, 2017 17:50:15)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version