hexadecimal ejemplo dec convertir cast python sockets ip-address endianness

python - ejemplo - sql hex to dec



Convierta la cadena hexadecimal "little endian" a la dirección IP en Python (4)

¿Cuál es la mejor manera de convertir una cadena de esta forma en una dirección IP: "0200A8C0" . Los "octetos" presentes en la cadena están en orden inverso, es decir, la cadena de ejemplo dada debería generar 192.168.0.2 .


La manipulación de la dirección de red es proporcionada por el módulo de socket.

socket.inet_ntoa(packed_ip)

Convierta una dirección IPv4 empaquetada de 32 bits (una cadena de cuatro caracteres de longitud) en su representación de cadena de puntos punteada estándar (por ejemplo, ''123.45.67.89''). Esto es útil cuando se conversa con un programa que usa la biblioteca C estándar y necesita objetos del tipo struct in_addr, que es el tipo C para los datos binarios empaquetados de 32 bits que esta función toma como argumento.

Puede traducir su cadena hexadecimal a packed ip usando struct.pack() y el pequeño endian, formato largo sin firmar.

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


Mi intento:

a = ''0200A8C0'' indices = range(0, 8, 2) data = [str(int(a[x:x+2], 16)) for x in indices] ''.''.join(reversed(data))


Podrías hacer algo como esto:

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

La división de octetos probablemente podría hacerse de forma más elegante, pero no puedo pensar en una manera más simple de la parte superior de mi cabeza.

EDITAR: O en una línea:

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


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

Es corto y claro; envuélvalo en una función con verificación de errores para satisfacer sus necesidades.

Funciones de agrupación prácticas:

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