Преобразуйте шестнадцатеричную строку “с прямым порядком байтов” в IP-адрес в Python

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

8
задан Matt Joiner 4 February 2010 в 07:16
поделиться

4 ответа

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

socket.inet_ntoa (Pack_ip)

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

Вы можете преобразовать свою шестнадцатеричную строку в упакованный 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'
>>> 
32
ответ дан 5 December 2019 в 04:49
поделиться

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

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

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

РЕДАКТИРОВАТЬ: Или в одной строке:

>>> 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
3
ответ дан 5 December 2019 в 04:49
поделиться
>>> 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
5
ответ дан 5 December 2019 в 04:49
поделиться

Моя попытка:

a = '0200A8C0'
indices = range(0, 8, 2)
data = [str(int(a[x:x+2], 16)) for x in indices]
'.'.join(reversed(data))
0
ответ дан 5 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: