2010-02-04 25 views

Respuesta

27

red es proporcionada por el módulo de socket.

socket.inet_ntoa(packed_ip)

Convertir una dirección de 32 bits embalado IPv4 (una cadena de cuatro caracteres de longitud) a su representación estándar cadena decimal con puntos (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, el formato largo sin signo.

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

La respuesta más útil, IMO. –

+1

Quiere " Omnifarious

+0

@Omnifarious, ¿cómo es exactamente su efecto "largo/int" aquí? –

2

se podría 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 octeto probablemente podría hacerse más elegante, pero no puedo pensar en una manera más simple de la parte superior de la cabeza.

EDIT: 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 
+0

sí teh agrupación en particular, llega a mí. no puedo encontrar una buena forma de "dividir" los octetos, y repetir _those_ en orden inverso, espero que alguien sepa –

+0

@Max, la respuesta de Roger contiene una forma muy intrigante de hacer esto. –

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


opciones de agrupamiento prácticas: la manipulación de direcciones

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

@Roger, ¿cómo funciona 'zip (* [iter (s)] * 2)'? Estoy muy interesado en eso. –

+3

¡Esto es bastante hack! 'iter (s)' devuelve un iterador sobre la cadena. Multiplicando la lista de este iterador por 2 se crearán dos referencias ** para el mismo iterador **. 'zip()' devuelve una lista de tuplas que contiene un elemento de cada uno de sus argumentos. Como ambos argumentos son el mismo iterador, tomará dos veces para cada tupla y devolverá una tupla de cada uno de los dos caracteres adyacentes. Nunca hubiera pensado en intentar algo como esto. : D –

+0

@Matt: Es el núcleo de la mayoría de las recetas de "agrupación" que he visto, y Max lo explicó bien. Se actualizará para incluir dos funciones cortas en esa línea. –

0

Mi intento:

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