IP String in hex

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
cruzer*
User
Beiträge: 21
Registriert: Mittwoch 4. September 2013, 10:50

Hallo,
ich möchte meine IP String in einen Hex String formatieren. Jedoch bekomme ich nicht das gewünschte Format.

Ich suche das hier:

'192.169.123.123' -> '\xC0\xA9\x7B\x7B'

aber das \x bereitet mir schwierigkeiten. Ich bekomme entweder nur die hex werte oder die hexwerte mit 0x\C0.

auch das hat nicht funktioniert:

Code: Alles auswählen

>>> ip = "192.168.0.1"
>>> ip = ip.split('.')
>>> ip
['192', '168', '0', '1']
>>> ip = '\x' + hex(ip[0]) + '\x' + hex(ip[1]) + '\x' + hex(ip[2]) + '\x' + hex(ip[3])
und hier funktioniert es nur in bei manchen Zahlen:

Code: Alles auswählen

>>> ip = ip.split('.')
>>> ip
['192', '168', '112', '123']
>>> ip = chr(int(ip[0])) + chr(int(ip[1])) + chr(int(ip[2])) + chr(int(ip[3]))
>>> ip
'\xc0\xa8p{'
jemand eine Idee?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Du bekommst durchaus was du willst. Das ist nur eine Frage der Darstellung, die sich im übrigen bei Python 2 und Python 3 auch noch unterscheidet.

Python 2:

Code: Alles auswählen

>>> '\xc0\xa8\x70\x7b'
'\xc0\xa8p{'
Python 3:

Code: Alles auswählen

>>> '\xc0\xa8\x70\x7b'
'ˬp{'
Der Inhalt ist jedes mal identisch.


Eine alternative Variante für die Umwandlung sähe übrigens wie folgt aus.

Code: Alles auswählen

>>> ip = '192.168.112.123'
>>> ''.join(map(chr, map(int, ip.split('.'))))
'\xc0\xa8p{'

Und die eingebaute Methode folgt hier.

Code: Alles auswählen

>>> import socket
>>> ip = '192.168.112.123'
>>> socket.inet_aton(ip)
'\xc0\xa8p{'
Zuletzt geändert von /me am Donnerstag 17. Oktober 2013, 15:36, insgesamt 2-mal geändert.
cruzer*
User
Beiträge: 21
Registriert: Mittwoch 4. September 2013, 10:50

/me hat geschrieben: Python 2:

Code: Alles auswählen

>>> '\xc0\xa8\x70\x7b'
'\xc0\xa8p{'
Ich schreibe in python 2.

Ich benötige es um die IP adresse in einen RAW socket einzutragen. erkennt er also auch : '\xc0\xa8p{' als '\xc0\xa8\x70\x7b' ?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

cruzer* hat geschrieben:Ich benötige es um die IP adresse in einen RAW socket einzutragen. erkennt er also auch : '\xc0\xa8p{' als '\xc0\xa8\x70\x7b' ?
Wir reden hier von Bytes. Du schickst ja keinen String mit den Zeichen '\', 'x', 'c', '0', ...

Du sendest exakt 4 Bytes und ob ein Byte jetzt in der Anzeige zu 'p' oder zu '\x70' konvertiert wird ist ist völlig egal. Es ist und bleibt ein und das selbe Byte. Bitte unterscheide Inhalt und Darstellung.
cruzer*
User
Beiträge: 21
Registriert: Mittwoch 4. September 2013, 10:50

Also habe ich schon den richtigen Inhalt und habe mich von der Darstellung verblenden lassen?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

cruzer* hat geschrieben:Also habe ich schon den richtigen Inhalt und habe mich von der Darstellung verblenden lassen?
Ja. Das ist allerdings nichts Ungewöhnliches. :D

Zum Umwandeln solltest du aber tatsächlich das in meinem Beispiel oben gezeigte und genau für diese Aufgabe vorgesehene inet_aton statt deiner eigenen Lösung verwenden.
cruzer*
User
Beiträge: 21
Registriert: Mittwoch 4. September 2013, 10:50

Vielen Dank!
Antworten