Уведомления

Группа в Telegram: @pythonsu

#1 Май 14, 2012 11:32:42

UsCr
От:
Зарегистрирован: 2009-11-04
Сообщения: 216
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с IP адресами в Python скрипте.

Здравствуйте. Совершенно вылетело из головы, как называется форма записи IP адреса в виде числа. А поскольку названия этой формы записи я не помню, путь в гугл для меня закрыт. По этой же причине заголовок темы такой…странный. Прошу помощи.

О чём речь:

В mysql IP адреса пишутся с помощью функции inet_aton(), например IP 10.170.112.12 превращается в 178941964. По странным запросам в гугле (вроде “Inet_aton python”) мне удалось отыскать вот такой способ:

struct.unpack('!L', socket.inet_aton('10.170.112.12'))[0]
но это ведь ад, не?

Сам вопрос:

как с помощью стандартных модулей питона преобразовывать IP адреса в ЭТУ форму записи и обратно?



Отредактировано UsCr (Май 14, 2012 11:33:21)

Офлайн

#2 Май 14, 2012 12:08:21

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Работа с IP адресами в Python скрипте.

Это нормальный вариант.

Можно так:

>>> def ip_to_number(ip):
...     ip = map(int, ip.split('.'))[::-1]
...     ip_num = 0
...     while ip:
...         ip_num = ( ip_num << 8 ) + ip.pop()
...         
...     return ip_num
...     
>>> ip_to_number('10.170.112.12')
178941964
>>>
>>> def number_to_ip(number):
...     ip = ''
...     for _ in xrange(4):
...         number, r = divmod(number, 256)
...         ip = '.'.join([str(r), ip])
...         
...     return ip[:-1]
...     
>>> number_to_ip(178941964)
'10.170.112.12'

Так же можно посмотреть IPy

А еще есть такой вариант:
def IntToDottedIP( intip ):
        octet = ''
        for exp in [3,2,1,0]:
                octet = octet + str(intip / ( 256 ** exp )) + "."
                intip = intip % ( 256 ** exp )
        return(octet.rstrip('.'))
 
def DottedIPToInt( dotted_ip ):
        exp = 3
        intip = 0
        for quad in dotted_ip.split('.'):
                intip = intip + (int(quad) * (256 ** exp))
                exp = exp - 1
        return(intip)

Отсюда



Отредактировано fata1ex (Май 14, 2012 12:42:10)

Офлайн

#3 Май 16, 2012 04:44:50

grok
От:
Зарегистрирован: 2010-09-09
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с IP адресами в Python скрипте.

UsCr
Здравствуйте. Совершенно вылетело из головы, как называется форма записи IP адреса в виде числа.
Альтернативный способ записи IP-адресов



Офлайн

#4 Май 21, 2012 18:13:13

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

Работа с IP адресами в Python скрипте.

UsCr
но это ведь ад, не?
Это самый нормальный способ. По крайней мере из тех, что я знаю.



Отредактировано asilyator (Май 21, 2012 18:14:30)

Офлайн

#5 Май 22, 2012 03:46:50

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

Работа с IP адресами в Python скрипте.

def f(ip):
    s = '{:02x}{:02x}{:02x}{:02x}'.format(*map(int, ip.split('.')))
    return int(s, 16)
 
def g(n):
    lst = [str((n >> (i * 8)) % 0x100) for i in range(4)]
    return '.'.join(lst[::-1])

>>> f('10.170.112.12')
178941964
>>> g(178941964)
'10.170.112.12'
>>>



Отредактировано py.user.next (Май 22, 2012 03:47:08)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version