2010-02-04 20 views

risposta

27

Network è fornito dal modulo zoccolo.

socket.inet_ntoa(packed_ip)

Convertire un indirizzo a 32 bit compresso IPv4 (una stringa di quattro caratteri) nella sua rappresentazione di stringa punteggiata-quad standard (per esempio, ‘123.45.67.89’). Ciò è utile quando si conversa con un programma che usa la libreria C standard e ha bisogno di oggetti di tipo struct in_addr, che è il tipo C per i dati binari a 32 bit che questa funzione assume come argomento.

È possibile tradurre la stringa esadecimale per packed ip utilizzando struct.pack() e il little endian, formato unsigned long.

>>> 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 risposta più utile, IMO. –

+1

Si desidera " Omnifarious

+0

@Omnifarious, com'è esattamente l'effetto "long/int" ness? –

2

Si potrebbe fare qualcosa di simile:

>>> 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 scissione ottetto potrebbe probabilmente essere fatto in modo più elegante, ma non riesco a pensare ad un modo più semplice fuori dalla parte superiore della mia testa.

EDIT: O su una sola riga:

>>> 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 raggruppamento, in particolare, arriva a me. Non riesco a trovare un modo carino per "bloccare" gli ottetti, e iterare _questo_ in ordine inverso, spero che qualcuno conosca un modo –

+0

@Max, la risposta di Roger contiene un modo molto intrigante per farlo. –

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 

È breve e chiaro; avvolgere in una funzione con controllo degli errori in base alle proprie esigenze.


funzioni di raggruppamento Handy: manipolazione indirizzo

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, come funziona 'zip (* [iter (s)] * 2)' funziona? Sono molto interessato a questo. –

+3

Questo è abbastanza l'hack! 'iter (s)' restituisce un iteratore sulla stringa. Moltiplicando la lista di questo iteratore di 2 si creeranno due riferimenti ** allo stesso iteratore **. 'zip()' restituisce una lista di tuple contenenti un elemento da ciascuno dei suoi argomenti. Poiché entrambi gli argomenti sono lo stesso iteratore, ne prenderà due volte per ogni tupla, restituendo una tupla di ciascun 2 caratteri adiacenti. Non avrei mai pensato di provare qualcosa di simile. : D –

+0

@Matt: è il nucleo della maggior parte delle ricette di "raggruppamento" che ho visto e Max lo ha spiegato bene. Aggiornerà per includere due brevi funzioni in questo senso. –

0

La mia prova:

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