Преобразование из строки IP в целое число и обратно в Python

У меня есть небольшая проблема с моим скриптом, где мне нужно преобразовать ip в форме «xxx.xxx.xxx.xxx» в целочисленное представление и вернуться из этой формы.

def iptoint(ip): return int(socket.inet_aton(ip).encode('hex'),16) def inttoip(ip): return socket.inet_ntoa(hex(ip)[2:].decode('hex')) In [65]: inttoip(iptoint('192.168.1.1')) Out[65]: '192.168.1.1' In [66]: inttoip(iptoint('4.1.75.131')) --------------------------------------------------------------------------- error Traceback (most recent call last) /home/thc/<ipython console> in <module>() /home/thc/<ipython console> in inttoip(ip) error: packed IP wrong length for inet_ntoa` 

Кто-нибудь знает, как это исправить?

6 Solutions collect form web for “Преобразование из строки IP в целое число и обратно в Python”

 def ip2int(addr): return struct.unpack("!I", socket.inet_aton(addr))[0] def int2ip(addr): return socket.inet_ntoa(struct.pack("!I", addr)) 

В чистом питоне без использования дополнительного модуля

 def IP2Int(ip): o = map(int, ip.split('.')) res = (16777216 * o[0]) + (65536 * o[1]) + (256 * o[2]) + o[3] return res def Int2IP(ipnum): o1 = int(ipnum / 16777216) % 256 o2 = int(ipnum / 65536) % 256 o3 = int(ipnum / 256) % 256 o4 = int(ipnum) % 256 return '%(o1)s.%(o2)s.%(o3)s.%(o4)s' % locals() # Example print('192.168.0.1 -> %s' % IP2Int('192.168.0.1')) print('3232235521 -> %s' % Int2IP(3232235521)) 

Результат:

 192.168.0.1 -> 3232235521 3232235521 -> 192.168.0.1 

Вы теряете левое-нулевое дополнение, которое прерывает декодирование вашей строки.

Вот работа:

 def inttoip(ip): return socket.inet_ntoa(hex(ip)[2:].zfill(8).decode('hex')) 

Python 3 имеет модуль ipaddress, который имеет очень простое преобразование:

 int(ipaddress.IPv4Address("192.168.0.1")) str(ipaddress.IPv4Address(3232235521)) 

Ниже приведены самые быстрые и самые простые (насколько мне известно) преобразователи для IPv4 и IPv6:

  try: _str = socket.inet_pton(socket.AF_INET, val) except socket.error: raise ValueError return struct.unpack('!I', _str)[0] ------------------------------------------------- return socket.inet_ntop(socket.AF_INET, struct.pack('!I', n)) ------------------------------------------------- try: _str = socket.inet_pton(socket.AF_INET6, val) except socket.error: raise ValueError a, b = struct.unpack('!2Q', _str) return (a << 64) | b ------------------------------------------------- a = n >> 64 b = n & ((1 << 64) - 1) return socket.inet_ntop(socket.AF_INET6, struct.pack('!2Q', a, b)) 

Код Python, не использующий inet_ntop() и struct module, по порядку величины медленнее, чем это, независимо от того, что он делает.

Вы также можете просто использовать функциональное программирование, используя

 reduce(lambda out, x: (out << 8) + int(x), '127.0.0.1'.split('.'), 0) 

в основном эта линия делает

 out = 0 out << 8 + 127 out << 8 + 0 out << 8 + 0 out << 8 + 1 
  • Получить сетевой адрес и маску сети в Python
  • Как получить IP-адрес клиента от SimpleHTTPServer
  • Как я могу сгенерировать все возможные IP-адреса из списка диапазонов ip в Python?
  • Python: получить локальный IP-адрес, используемый для отправки IP-данных на конкретный удаленный IP-адрес
  • Настройка параметров сети из Python / Django на машине Linux / Ubuntu
  • Как проверить, находится ли ip в сети в python
  • Как запретить пользователям из моего приложения Django (с завихрением)
  • Python, Как получить все внешние IP-адреса с несколькими NIC
  •  
    Interesting Posts for Van-Lav

    эффективный способ получить максимум каждой строки для большой разреженной матрицы

    Распределять точки по кругу как можно равномерно

    Как извлечь атрибут xml с помощью Python ElementTree

    как я могу запустить IDLE, среду разработки для Python, в Mac OS 10.7?

    Как установить pymysql на AWS лямбда

    Python формирует POST с использованием urllib2 (также вопрос о сохранении / использовании файлов cookie)

    Как сохранить изображение в качестве поля Bytes в базе данных cassandra с помощью cql engine?

    Изменение масштаба оси в нулевом графике

    python scrapy как использовать BaseDupeFilter

    Python под Mac OS X: Framework

    Оператор возврата на нескольких строках

    Сопоставьте поле отправителя электронной почты с движком Google

    python: простой пример для яйца python с файлом с одним файлом?

    Сценарий Python с аргументами для командной строки Blender

    Каковы наилучшие методы проверки того, имеет ли пользователь сценария Python привилегии root?

    Python - лучший язык программирования в мире.