Ich möchte eine hexadezimale Ziffer hh mit \ x verketten, um eine Zeichenfolge "\ xhh" zu erstellen, die ich dann in eine Liste einfügen und in eine lange Zeichenfolge konvertieren werde. Hier ist mein aktueller Code dafür, der einen Fehler auslöst:

ValueError: Ungültiges \ x Escape

Dieser Fehler ist für mich sinnvoll, da ich glaube, dass \ x an etwas angehängt werden muss, damit der Computer es erkennt, und ich bin mir nicht sicher, wie ich das tun kann. Ich frage mich, ob so etwas wie "\" + "x" + hh funktionieren würde, und gibt es auch eine effizientere Möglichkeit, dies zu tun?

Hier ist mein Code, wie er steht, als er den Fehler verursacht hat: (Hinweis - Volt-, Curr- und Prüfsummenwerte variieren. Ich habe nur Beispielwerte dafür eingegeben.)

voltValues = [30, 30, 30]
currValues = [30, 30, 30]
checksumValues = [39, 33]
v1 = "\x" + voltValues[0]
v2 = "\x" + voltValues[1]
v3 = "\x" + voltValues[2]
c1 = "\x" + currValues[0]
c2 = "\x" + currValues[1]
c3 = "\x" + currValues[2]
cs1 = "\x" + checksumValues[0]
cs2 = "\x" + checksumValues[1]

list = [ "\x01", "\x30", "\x53", v1, v2, v3, c1, c2, c3, "\x46", "\x46", "\x46", "\x30", "\x30", "\x30", "\x32", "\x46", "\x46", cs1, cs2, "\x0D" ]
return ''.join(list)

Ich möchte, dass "\ x01 \ x30 \ x53 \ x30 \ x30 \ x30 \ x30 \ x30 \ x30 \ x46 \ x46 \ x46 \ x30 \ x30 \ x30 \ x32 \ x46 \ x46 \ x39 \ x33 \ x0D" zurückgegeben wird.

0
user2933060 3 Dez. 2013 im 23:27

3 Antworten

Beste Antwort

Sie können den gesamten Prozess abkürzen, indem Sie int(s, 16) sagen, um jeden zweistelligen Hex-Code s in eine Ganzzahl umzuwandeln, und chr(), um ihn weiter in ein Zeichen umzuwandeln. Beispiel: chr(int('4A', 16)) gibt 'J' zurück. Ihr Versuch, '\x' zu verketten, schlägt fehl, da Hex-Codes wie \xAA zu dem Zeitpunkt, zu dem der Interpreter sie liest, im Python-Code selbst als Literale interpretiert werden.

Übrigens werden die Voltwerte in Ihrem Programm zunächst nicht in hexadezimal ausgedrückt. Oder als Saiten. Die folgenden Ergebnisse ergeben alle das gleiche Ergebnis:

v = 0x4A   # the proper way to write int literals in hex
print chr(v)

v = 74     # without the 0x, this is interpreted as decimal
print chr(v)

v = '4A'   # in quotes, it can be anything you like, but then you need int(v,16)
print chr(int(v, 16))
3
jez 3 Dez. 2013 im 19:39

Sie möchten sich die integrierte Funktion chr ansehen.

v1 = chr(voltValues[0])

Setzt v1 auf '\ x1e'.

Wenn Sie möchten, dass dies hexadezimal ist, ergibt das Setzen von voltValues [0] auf 0x30 eine v1 von '0'.

0
nmichaels 3 Dez. 2013 im 19:31

So wie Sie es derzeit haben, erstellt Python einen String mit dem Wert "\ x" und versucht dann, 30 hinzuzufügen (was fehlschlägt, da dies einen str und einen int verketten würde).

Was Sie tun möchten, wäre ungefähr so:

v1 = chr(int(str(voltValues[0]), 16))

Dadurch wird zuerst eine Zeichenfolge aus Ihrem Wert erstellt, damit int () ihn analysieren kann. Es analysiert dann diese Zeichenfolge an der Basis 16 (es analysiert sie als Hex-Daten). Danach wird die Zeichenfolge erstellt, die eine Codierung der gerade erstellten Ganzzahl enthält. Dies bedeutet, dass e. G.

>>> chr(0x30)
'0'
>>> "\x30"
'0'
>>> chr(0x41)
'A'
>>> "\x41"
'A'
1
jazzpi 3 Dez. 2013 im 19:37