Seite 1 von 1

Problem mit Backslashes in Strings

Verfasst: Dienstag 14. Juli 2009, 12:07
von Ovaron
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.

Verfasst: Dienstag 14. Juli 2009, 12:18
von HerrHagen
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

Verfasst: Dienstag 14. Juli 2009, 12:21
von EyDu
struct könnte man hier einsparen:

Code: Alles auswählen

>>> map(ord, '\x00\x0c\x85\xaa\xd1\xc0')
[0, 12, 133, 170, 209, 192]

Verfasst: Dienstag 14. Juli 2009, 12:23
von audax

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

Verfasst: Dienstag 14. Juli 2009, 12:37
von Ovaron
@ 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.

Verfasst: Dienstag 14. Juli 2009, 15:45
von birkenfeld
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)`.

Verfasst: Mittwoch 15. Juli 2009, 09:07
von sma
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