2016-08-01 33 views
1
In [301]: string_to_write 
Out[301]: '0x010x530x380x430x430x330x460x460x300x300x300x300x300x300x310x320x310x0D' 

In [302]: len(string_to_write) 
Out[302]: 72 

In [303]: thestring="\x01\x53\x38\x43\x43\x33\x46\x46\x30\x30\x30\x30\x30\x30\x31\x32\x31\x0D" 

In [304]: print thestring 
S8CC3FF000000121 

In [305]: len(thestring) 
Out[305]: 18 

Ich muss serielle Schnittstelle verwenden, um mit einem Gerät zu kommunizieren, und ich muss eine Zeichenfolge an den Anschluss schreiben. Ich gab thestring durch die Tastatur ein, während ich Schleife verwendete, um jedes der hexadezimalen Zeichen zu string_to_write zu schreiben. Ich muss dies string_to_write in thestring konvertieren. Wie kann ich Python Gruppen von jeweils vier Zeichen als Hexadezimal identifizieren?Wie lassen sich ASCII-codierte Hexadezimale in einem Array als Hexadezimalzahlen und nicht als Zeichen in einer Zeichenfolge von Python behandeln?

+0

Danke Iron Fist für deine Bearbeitung. – GH92

+0

Verwenden Sie Python2? –

+0

Ja, ich benutze Python2.7. – GH92

Antwort

0

Sie müssen string_to_write in Strings der Länge 4 hacken, konvertieren, diese Strings in Integer, dann jede dieser Zahlen in Zeichen umwandeln. Hier ist eine effiziente Möglichkeit, dies in Python 2 zu tun (in Python 3 ist ein anderer Ansatz erforderlich). Beachten Sie, dass dieser Code annimmt, dass alle Ihre Hex-Codes genau 4 Zeichen enthalten, mit der führenden 0x. Dieses Skript verwendet auch binascii.hexlify, um die Ausgabedaten in einem praktischen Format zu drucken.

from binascii import hexlify 

def hex_to_bin(s): 
    return ''.join([chr(int(''.join(u), 16)) for u in zip(*[iter(s)] * 4)]) 

s2w = '0x010x530x380x430x430x330x460x460x300x300x300x300x300x300x310x320x310x0D' 
thestring = "\x01\x53\x38\x43\x43\x33\x46\x46\x30\x30\x30\x30\x30\x30\x31\x32\x31\x0D" 

out = hex_to_bin(s2w) 
print repr(thestring) 
print repr(out) 
print hexlify(out) 
print thestring == out 

Ausgang

'\x01S8CC3FF000000121\r' 
'\x01S8CC3FF000000121\r' 
01533843433346463030303030303132310d 
True 
+0

Perfekt. Klappt wunderbar. Vielen Dank. – GH92

0

Verwenden Sie einfach das eingebaute in kodieren lib zum Beispiel:

>>> "hello".encode("hex") 
'68656c6c6f' 
>>> "68656c6c6f".decode("hex") 
'hello' 
>>> 
+0

Das tut nicht, was das OP will. –

0

können Sie dies als Beispiel verwenden können:

string_to_write = '0x010x530x380x430x430x330x460x460x300x300x300x300x300x300x310x320x310x0D' 
temp = [i for i in string_to_write.split('0x') if i] 
print map(lambda x: int('0x'+x, 16), temp) 

op:

[1, 83, 56, 67, 67, 51, 70, 70, 48, 48, 48, 48, 48, 48, 49, 50, 49, 13]