2014-10-22 10 views
5

Beim Versuch, mit einem Audioverarbeitungsgerät namens BSS London Blu-80 zu kommunizieren, entdeckte ich, dass ich eine Prüfsumme senden muss, die durch Xoring der Nachricht erstellt wurde. Eine Beispielnachricht, die gesendet wird, wäre:Erstellen von xor-Prüfsummen aller Bytes in Hexadezimalzeichen In Python

0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x4b 0x00 0x00 0xc2 

Mit 0xc2 ist die richtige Prüfsumme für diese Nachricht.

"Die Prüfsumme ist ein einzelnes Byte exklusive oder (xor) aller Bytes im Nachrichtentext."

Der Nachrichtentext ist oberhalb der Prüfsumme.

Der Code, den ich versuchen, aber:

packet = '0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x4b 0x00 0x00' 
xor = 0 
i = 0 
while i < len(packet): 
    xor = xor^ord(packet[i]) 
    i += 1 

>>print xor 
46 
>>print hex(xor) 
'0x2e' 

ich natürlich bin hier falsch, etwas zu tun, und nicht in vollem Umfang das zu verstehen. Jede Hilfe wird sehr geschätzt.

Danke!

+1

Versuchen Sie 'packet = '\ x8d \ x1e \ x19 \ x1b \ x83 \ x00 \ x01 \ x01 \ x00 \ x00 \ x00 \ x4b \ x00 \ x00''. –

+0

Sie können Ihr Ergebnis hier überprüfen: th-thelemann.de/tools/checksum.html –

Antwort

5

Sie packet als druckbare Darstellung erklärt haben der Nachricht:

packet = '0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x4b 0x00 0x00' 

so Ihre aktuelle Nachricht ist nicht [0x8d, 0x1e, ..., 0x00], sondern ['0', 'x', '8', 'd', ..., '0'] statt. Also, erster Schritt wird Festsetzung:

packet = '0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x4b 0x00 0x00' 
packet = [chr(int(x, 16)) for x in packet.split(' ')] 

Oder könnten Sie kodieren, es „richtig“ von Anfang an berücksichtigen:

packet = '\x8d\x1e\x19\x1b\x83\x00\x01\x01\x00\x00\x00\x4b\x00\x00' 

An diesem Punkt können wir xor, Mitglied von Mitglied:

Die Prüfsumme, die ich bekomme, ist 0x59, nicht 0xc2, was bedeutet, dass entweder Sie die falsche berechnet haben oder die ursprüngliche Nachricht nicht die ist, die Sie geliefert haben.

+0

Nun, das trägt nur zur Verwirrung bei. Diese Nachricht mit Prüfsumme wurde mit dem Werkzeug generiert, mit dem Befehle an verschiedene Objekte innerhalb der blu-10 getestet wurden. Wenn ich diese Nachricht kopiere und sie direkt mit Python sende, ändert sich der Status des Objekts. Damit ist die Prüfsumme für diese Zeichenfolge korrekt. – Nicholas

+0

Die Dokumentation, auf die Sie sich beziehen, sagt _ " ist das exklusive OR aller Bytes in , ** vor der Ersetzung **." _. Ich weiß nicht, was _ "Substitution" _ hier bedeutet, aber ich denke, das Problem liegt darin, was ersetzt wird. –

+0

Sie waren genau richtig. Die ganze Zeit dachte ich, ich würde nicht ersetzen. Ich dachte jedoch nie, dass die vom DI-Tool generierte Zeichenkette mir eine Zeichenfolge mit Substitutionen anzeigt. Nachdem ich '\ x1b \ x83' entfernt und durch Ersetzen ersetzt habe (\ x03), konnte ich die Prüfsumme generieren c2 zurückgeben. Danke, dass Sie mich darauf aufmerksam gemacht haben! – Nicholas