2016-07-27 17 views
1

Ich habe einen kleinen Server, der Rohdaten mit einem Socket in Python sendet, das nur Bytearrays als Eingabe akzeptiert. In diesem Bytearray muss ich Mac-Adressen angeben. Diese MAC-Adressen stammen aus einer JSON-Datei, die als String importiert wird. z. B. "00 11 22 33 44 55" (eigentlich ohne die Leerzeichen)"Buchstäblich" einen String in ein Bytearray konvertieren

was ich suche, ist eine einfache Möglichkeit zum Codieren dieser Zeichenfolge in einem Bytearray. Also sollte das erste Byte 00, Sekunde 11 usw. sein.

Alle "Lösungen", die ich gefunden habe, werden jede Zeichenfolge in ein Byte-Array codieren, aber das ist nicht das, was ich will, weil es meine Mac-Adresse weiter aufteilt, weil sie zum Beispiel 0, dann 0 kodieren , dann 1, dann 1 und so weiter, so dass meine 6-Byte-MAC-Adresse ein 12-Byte-codiertes Byte-Array wird.

Gibt es eine eingebaute Funktion, die ich verwenden kann oder muss ich meine eigene Funktion erstellen, um dies zu tun?


LöSUNG: Thx an euch alle und Arnial für die einfachste Antwort zu geben. Die Sache ist, alle diese Antworten, die ich mehr oder weniger ohne Wirkung ausprobiert, bevor ABER Mein Problem war nicht der Typ des Rückgabetyp dieser Methoden (die meine Steckdose immer senden verweigert), war es eigentlich die Länge der Nachricht, die ich versuchte zu senden. Der Socket weigert sich, Nachrichten zu senden, die kürzer als 12 Bytes sind (Quell-/Ziel-MAC-Adressen), aber ich habe nur eine kurze Nachricht mit dieser Beispiel-MAC-Adresse mit einer der hier vorgestellten Methoden konvertiert.

Also vielen Dank für Ihre Hilfe!

+0

werden Sie haben wahrscheinlich eine eigene Funktion zu erstellen. Sie müssen die Zeichenfolge in Zeichenpaaren durchlaufen und versuchen, dafür zu googeln. – jonrsharpe

+1

Wow, Python kommt mit einer überraschend großen Anzahl von Funktionen, um kleinere Variationen dieser Aufgabe auszuführen. 'bytes.fromhex',' binascii.unhexlify' (und sein anderer Name, binascii.a2b_hex') und 'base64.b16decode' sind in den Antworten bisher aufgetaucht. Ich frage mich, ob es mehr gibt. – user2357112

Antwort

2

Ihre Umwandlung, wie Sie denken nicht so wörtlich ist.

Die Zeichenfolge "00112233445566" ist 12 Zeichen lang, weshalb sie in ein 12-Byte-Array konvertiert wird.

dem Mac sieht aus wie Hex-codierte Byte-String, also wahrscheinlich können Sie verwenden:

bytes.fromhex("001122334455") 

Es wird Byte-Reihenfolge erstellen, die mit Null-Byte beginnt, dann 0x11 (17), als 0x22 (34). ..

+0

Schön, das ist der beste Weg, es zu tun. Sie müssen keine Pakete importieren oder Ihre eigene Konvertierung durchführen. –

1

Teilen Sie die Zeichenfolge einfach in Blöcke von 2 Zeichen und interpretieren Sie den Hexadezimalwert.

def str2bytes(string): 
    return tuple(int(string[i:i+2], 16) for i in range(0, len(string), 2)) 

print str2bytes("001122334455")   #(0, 17, 34, 51, 68, 85) 

Wenn Sie dann einen String-Version der oben haben suchen:

def str2bytes(string): 
    return "".join(chr(int(string[i:i+2], 16)) for i in range(0, len(string), 2)) 

print str2bytes("001122334455") #Encoded string '\x00\x11"3DU' same as '\x00\x11\x22\x33\x44\x55' 
0

Dies ist eigentlich eingebaut! Es ist binascii.unhexlify.

import binascii 

binascii.unhexlify('001122334455') 
+0

Oh ja! Hab das total vergessen –

Verwandte Themen