Преобразуйте шестнадцатеричную строку «little endian» в IP-адрес в Python

Каков наилучший способ превратить строку в эту форму в IP-адрес: "0200A8C0" . «Октеты», присутствующие в строке, находятся в обратном порядке, т. Е. Данная строка примера должна генерировать 192.168.0.2 .

  • TypeError: объект 'module' не может быть вызван
  • Получение Errno 9: Плохой дескриптор файла в сокете python
  • Тайм-аут чтения с использованием либо urllib2, либо любой другой http-библиотеки
  • Создание необработанного HTTP-запроса с сокетами
  • Тайм-аут соединения сокетов Python
  • Как я могу написать сервер сокета в другом потоке из моей основной программы (используя gevent)?
  • Как я могу получить неблокирующий сокет connect ()?
  • Socket Thread и PyGTK
  • Как читать целые числа из файла, который является 24-битным и маленьким, с использованием Python?
  • Имитировать несколько IP-адресов для тестирования
  • Основной процесс Python останавливается с использованием вызовов подпроцесса в SocketServer
  • pyInstaller: Ошибка импорта
  • 4 Solutions collect form web for “Преобразуйте шестнадцатеричную строку «little endian» в IP-адрес в Python”

    Управление сетевыми адресами обеспечивается модулем сокета.

    socket.inet_ntoa(packed_ip)

    Преобразуйте 32-битный пакетный IPv4-адрес (строка длиной четыре символа) в стандартное строковое представление с точками-квадратиками (например, «123.45.67.89»). Это полезно при разговоре с программой, использующей стандартную библиотеку C, и ей нужны объекты типа struct in_addr, который является типом C для 32-разрядных бинарных данных, которые эта функция принимает в качестве аргумента.

    Вы можете перевести шестнадцатеричную строку в packed ip используя struct.pack() и маленький конец, без знака длинного формата.

     >>> import socket >>> import struct >>> addr_long = int("0200A8C0",16) >>> hex(addr_long) '0x200a8c0' >>> struct.pack("<L", addr_long) '\xc0\xa8\x00\x02' >>> socket.inet_ntoa(struct.pack("<L", addr_long)) '192.168.0.2' >>> 
     >>> s = "0200A8C0" >>> bytes = ["".join(x) for x in zip(*[iter(s)]*2)] >>> bytes ['02', '00', 'A8', 'C0'] >>> bytes = [int(x, 16) for x in bytes] >>> bytes [2, 0, 168, 192] >>> print ".".join(str(x) for x in reversed(bytes)) 192.168.0.2 

    Он короткий и ясный; заверните его в функцию с проверкой ошибок в соответствии с вашими потребностями.


    Удобные функции группировки:

     def group(iterable, n=2, missing=None, longest=True): """Group from a single iterable into groups of n. Derived from http://bugs.python.org/issue1643 """ if n < 1: raise ValueError("invalid n") args = (iter(iterable),) * n if longest: return itertools.izip_longest(*args, fillvalue=missing) else: return itertools.izip(*args) def group_some(iterable, n=2): """Group from a single iterable into groups of at most n.""" if n < 1: raise ValueError("invalid n") iterable = iter(iterable) while True: L = list(itertools.islice(iterable, n)) if L: yield L else: break 

    Вы могли бы сделать что-то вроде этого:

     >>> s = '0200A8C0' >>> octets = [s[i:i+2] for i in range(0, len(s), 2)] >>> ip = [int(i, 16) for i in reversed(octets)] >>> ip_formatted = '.'.join(str(i) for i in ip) >>> print ip_formatted 192.168.0.2 

    Октетное расщепление, вероятно, можно было бы сделать более элегантно, но я не могу придумать более простой путь от головы.

    EDIT: Или в одной строке:

     >>> s = '0200A8C0' >>> print '.'.join(str(int(i, 16)) for i in reversed([s[i:i+2] for i in range(0, len(s), 2)])) 192.168.0.2 

    Моя попытка:

     a = '0200A8C0' indices = range(0, 8, 2) data = [str(int(a[x:x+2], 16)) for x in indices] '.'.join(reversed(data)) 
    Python - лучший язык программирования в мире.