2017-01-15 5 views
1

Ich möchte meine eigene struct.pack spezifische Funktion implementieren, um eine IP-Zeichenfolge (d. H. "192.168.0.1") zu einem 32-Bit-gepackten Wert zu packen, ohne die integrierte Methode socket.inet_aton zu verwenden.Python pack IP-Zeichenfolge

ich so weit gekommen:

ip = "192.168.0.1" 
hex_list = map(hex, map(int, ip.split('.'))) 
# hex list now is : ['0xc0', '0xa8', '0x0', '0x01'] 

Meine Frage ist: Wie komme ich von diesem ['0xc0', '0xa8', '0x0', '0x01']-'\xc0\xa8\x00\x01', (das ist, was ich von socket.inet_aton(ip)

bekommen (? Und auch - Wie ist es möglich, dass es eine NUL (\x00) in der Mitte dieser Zeichenfolge gibt? Ich glaube, ich habe ein wenig Verständnis für das Format \x)

Antwort

0

Eine Alternative:

Können Sie ipaddress und to_bytes (Python 3.2)?

>>> import ipaddress 
>>> address = ipaddress.IPv4Address('192.168.0.1') 
>>> address_as_int = int(address) 
>>> address_as_int.to_bytes(4, byteorder='big') 
b'\xc0\xa8\x00\x01' 

Beachten Sie, dass Sie tatsächlich nur die ganze Zahl benötigen.

kürzer offensichtlich sein, wollte aber alle Schritte klar zeigen :)

+0

Vielen Dank für Ihre Antwort! –

1

Sie Zeichenfolge Verständnis verwenden können, formatieren, wie Sie möchten:

ip = "192.168.0.1" 
hex_list = map(int, ip.split('.')) 
hex_string = ''.join(['\\x%02x' % x for x in hex_list]) 

oder als Motto:

hex_string = ''.join(['\\x%02x' % int(x) for x in ip.split('.')]) 
+0

Ich habe das versucht, aber ich bekomme '\\ xc0 \\ xa8 \\ x00 \\ x01', was ungleich '\ xc0 \ xa8 \ x00 \ x01' ist. Ist es das Gleiche? –

+0

Das '\\' ist nur Pythons Weg, dir ein einzelnes '\' zu zeigen. ändere das '' \\ x% 02x'' in 'r '\ x% 02x'' und beachte, dass du das gleiche Ergebnis bekommst. –

+0

Ich weiß das, aber wird es auch so sein, wenn ich diese Adresse sende? Wird es der Wert sein, der von "socket.inet_aton" erhalten wird? –