2010-02-04 9 views

Antwort

27

Netzwerkadresse Manipulation durch den Buchsenmodul vorgesehen ist.

socket.inet_ntoa(packed_ip)

Konvertieren eine 32-Bit-gepackte IPv4-Adresse (eine Zeichenfolge vier Zeichen in der Länge) auf seine Standard gepunktetes Viereck Stringdarstellung (zum Beispiel ‚123.45.67.89‘). Dies ist nützlich, wenn Sie mit einem Programm kommunizieren, das die C-Standardbibliothek verwendet, und Objekte des Typs struct in_addr benötigt, bei der es sich um den C-Typ für die gepackten 32-Bit-Binärdaten handelt, die diese Funktion als Argument verwendet.

Sie können Ihren Hex-String zu packed ip mit struct.pack() und dem Little-Endian, unsigned long-Format übersetzen.

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

Die nützlichste Antwort, IMO. –

+1

Sie wollen " Omnifarious

+0

@Onmifarious, wie genau wirkt es hier "lang/int"? –

2

Man könnte so etwas tun:

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

Das Oktett Spaltung wahrscheinlich mehr elegant getan werden könnte, aber ich kann eine einfachere Art und Weise aus der Spitze von meinem Kopf nicht denken.

EDIT: Oder auf einer Linie:

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

ja teh Gruppierung insbesondere mir bekommt. Ich kann keinen netten Weg finden, die Oktetts zu "zerhacken" und in umgekehrter Reihenfolge zu wiederholen. Ich hoffe, dass jemand einen Weg kennt. –

+0

@Max, Rogers Antwort enthält eine sehr interessante Möglichkeit, dies zu tun. –

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 ist kurz und klar; Wickeln Sie es in einer Funktion mit Fehlerprüfung ein, um Ihren Bedürfnissen zu entsprechen.


Handlicher Gruppierungsfunktionen:

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, wie funktioniert das 'zip (* [iter (s)] * 2)'? Das interessiert mich sehr. –

+3

Das ist ziemlich der Hack! 'iter (s)' gibt einen Iterator über den String zurück. Durch Multiplizieren der Liste dieses Iterators mit 2 werden zwei Referenzen ** für denselben Iterator ** erstellt. 'zip()' gibt eine Liste von Tupeln zurück, die ein Element von jedem seiner Argumente enthalten. Da beide Argumente derselbe Iterator sind, wird er zweimal für jedes Tupel verwendet, wobei ein Tupel von jeweils zwei benachbarten Zeichen zurückgegeben wird. Ich hätte nie daran gedacht, so etwas zu versuchen. : D –

+0

@Matt: Es ist der Kern der meisten "Gruppierung" Rezepte, die ich gesehen habe, und Max hat es gut erklärt. Wird aktualisiert, um zwei kurze Funktionen in diesem Sinne zu enthalten. –

0

Mein Versuch:

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