Problem mit Backslashes in Strings

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
Ovaron
User
Beiträge: 8
Registriert: Montag 15. Juni 2009, 09:29

Hi!

Ich hab folgende Liste mit Strings die ich gerne bearbeiten würde:

Code: Alles auswählen

var = ['\x00\x0c\x85\xaa\xd1\xc0', '\x00\x0c\x85\xaa\xe1\x00']
und zwar sollen daraus Strings in der Art "00:0c:85:aa:d1:c0' werden.

aus irgendeinem Grund kann ich diese Strings jedoch nicht bearbeiten, und darauf zugreifen kann ich auch nicht. Folgender Code sollte die Umwandlung für den ersten Eintrag doch eigentlich schaffen, tut es aber nicht. Die Zuweisung von var[0] zu teststring liefert beispielsweise nur einen leeren String.

Code: Alles auswählen

var[0] = var[0].replace('\\x', '', 1)
var[0] = var[0].replace('\\x', ':')

teststring = var[0]
print 'teststring: ',  teststring
Was mach ich falsch? Es muss an den Backslashes liegen, nehm ich mal an.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Das leigt daran das \XX jeweils ein Zeichen darstellt. So wie \t für das eine Zeichen Tab steht. Demzufolge funktioniert auch das ersetzen nicht, da die Zeichenkette r"\XX" so nicht im String vorkommt.
Wenn du einfach nur einfach nur Bytes Hexadezimalzahlen umwandeln willst geht das mit encode. Willst du die eigentlichen Werte die dahinter stehen wissen nimmt man struct.

Code: Alles auswählen

>>> x = '\x00\x0c\x85\xaa\xd1\xc0'
>>> len(x)
6
>>> x.encode("hex")
'000c85aad1c0'
>>> import struct
>>> struct.unpack("BBBBBB", x)
(0, 12, 133, 170, 209, 192)
MFG HerrHagen
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

struct könnte man hier einsparen:

Code: Alles auswählen

>>> map(ord, '\x00\x0c\x85\xaa\xd1\xc0')
[0, 12, 133, 170, 209, 192]
Das Leben ist wie ein Tennisball.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

In [1]: var = ['\x00\x0c\x85\xaa\xd1\xc0', '\x00\x0c\x85\xaa\xe1\x00']

In [2]: print var[0]

���


In [3]: len(var[0])
Out[3]: 6

-> http://docs.python.org/reference/lexica ... l#literals
-> http://docs.python.org/tutorial/inputou ... formatting
-> http://docs.python.org/library/functions.html#hex

Code: Alles auswählen

 ':'.join(hex(ord(x))[2:].zfill(2) for x in var[0])
Ovaron
User
Beiträge: 8
Registriert: Montag 15. Juni 2009, 09:29

@ HerrHagen:

Danke für den Tipp mit der encode-Funktion, bis jetzt wusste ich nicht, das so etwas geht.

@audax:

Danke, diese eine Zeile macht genau was ich will. Ist zwar für mich als Anfänger noch sehr komplex der Code, aber ich werd mir mal die Links durchlesen, die du genannt hast.

edit: Ich hab mir die Seiten angeschaut. Kapiert hab ich den Inhalt nur teilweise, da werden Dinge erwähnt von denen ich noch nie gehört hab. Könntest du mir diese Zeile vielleicht in einer verständlicheren Form posten oder erklären ? Ich versteh das nur soweit, dass da eine Menge an Funktionen auf eine Zeile komprimiert sind, von denen ich nur einige einzeln verstehe.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

audax hat geschrieben:

Code: Alles auswählen

 ':'.join(hex(ord(x))[2:].zfill(2) for x in var[0])
Das ist noch etwas umständlich: `"%02x" % ord(x)`.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Es gibt ja fast nix, was man nicht mit einem kleinen regulären Ausdruck erledigen könnte - auch das Einfügen von ":":

Code: Alles auswählen

re.sub("(..)(?!$)", "\\1:", var[0].encode("hex"))
Stefan
Antworten