Wie konvertiere ich einen string von hexadezimalen Werten zu einer Liste von ganzen zahlen?
Ich habe eine lange Zeichenfolge von hexadezimalen Werten, die alle Recht ähnlich sieht:
'\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00'
Der eigentliche string ist 1024 frames einer Wellenform. Ich möchte konvertieren, diese hexadezimalen Werte zu einer Liste von integer-Werten, wie:
[0, 0, 0, 1, 0, 0, 0, 255, 255, 0, 0]
Wie konvertiere ich diese hex-Werte mit int-Werten?
- Sie haben eine byte-Zeichenfolge, die python beim drucken, konvertiert Sie zu einem string-literal Repräsentation für Sie. Die
\x00
entweicht, werden für jedes byte, das nicht druckbare ASCII-Zeichen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
ord()
in Kombination mitmap()
:struct.unpack()
verfügbar und in der Lage, die Interpretation der bytes als andere Arten auch.struct.unpack
, btw..struct
dauert 0,3 Sekunden für eine million Iterationen, währendmap(ord, s)
braucht 1,8 Sekunden.struct.unpack()
sind (1) ein extra zu importieren, und (2) Sie haben zu tun, einige string-Formatierung mitlen()
um die Länge der Zeichenfolge in der format-Spezifizierer, die scheint mir etwas unhandlich. Natürlich kann man verstecken hinter einer Funktion, aber ich bevorzuge die saubere Lösung und optimieren Sie später, nach dem profiling.map()
ist 10-mal langsamer, eigentlich.array.array()
wird die Schnellste option, in diesem Fall, schlagen sichstruct.unpack()
von über 20%.map
undord
alsstruct.unpack
, was macht mein code besser lesbar für den durchschnittlichen Programmierer."".join((chr(i) for i in lst))
. Nun, was ich gefragt habe war ob es eine Funktion zur Umwandlung einer Liste zu einem string "\x01\x02\x03...". Ich kann das natürlich "manuell" mit"".join("\\x%02x" % (i) for i in lst)
, aber das ist eine ganze Betrieb (auch in kompakter form), nicht eine Funktion.print "\x01"
druckt ein glückliches Gesicht! (Nicht von mir in diesem moment :)) Zu erhalten, "x\01" als solche, die Sie haben zu verwendenprint r'"\x01"
.\x01
OP heißt die einzigen steuerzeichen, die nicht die Folge von vier Zeichen\x01
. Wenn Sie möchten, dass die eigentliche escape-notation (aus unerfindlichen Gründen),repr()
ist eine Sache.verwenden
struct.entpacken
:Dies gibt Ihnen eine
tuple
statt einerlist
, aber ich vertraue darauf, können Sie es konvertieren, wenn Sie benötigen.Einige timings;
struct
ist noch schneller, aber Sie können manipulieren, einearray
und erhalten eine byte-Darstellung zurück, die mit weniger Schritten.