Найти - Пользователи
Полная версия: Работа с IP адресами в Python скрипте.
Начало » Python для новичков » Работа с IP адресами в Python скрипте.
1
UsCr
Здравствуйте. Совершенно вылетело из головы, как называется форма записи 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 адреса в ЭТУ форму записи и обратно?
fata1ex
Это нормальный вариант.

Можно так:
>>> 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)

Отсюда
grok
UsCr
Здравствуйте. Совершенно вылетело из головы, как называется форма записи IP адреса в виде числа.
Альтернативный способ записи IP-адресов
asilyator
UsCr
но это ведь ад, не?
Это самый нормальный способ. По крайней мере из тех, что я знаю.
py.user.next
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'
>>>
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