Hallo,
ich habe hier einen String über den ein Blockcheck erstellt werden muss.
Die Vorgehensweise:
Der String ist zeichenweise zu zerlegen, die Elemente sind alle via XOR-Verküpfung zu verknüpfen, anschließen 80hex (=128dec) hinzu zu addieren.
Bei mir scheitert es beim XOR aller einzelnen Zeichen.
Kann mir jemand auf die Sprünge helfen?
Beispiel:
var ="TEST"
> var nach bin:
T=01010100
E=01000101
S=01010011
T=01010100
> var nach XOR:
00010110 (22dec)
> Addition von 128dec:
10000000
=
10010110 (150dec)
> 0x96hex > Endergebnis: \x96
String byteweise "verXORen"
Sieht doch erstmal ganz gut aus. Ich bekomme das selbe Ergebnis raus wie du. Was genau siehst du daran als problematisch an? Ok, man könnte die Sinnhaftigkeit der Aufgabenstellung anzweifeln (mir erschließt sie sich zumindest nicht), aber ansonsten ist doch alles prima, oder nicht?
Code: Alles auswählen
In [17]: s
Out[17]: 'TEST'
In [18]: chr((reduce(operator.xor, bytearray(s), 0) + 0x80) & 0xff)
Out[18]: '\x96'
BlackJack hat geschrieben:Code: Alles auswählen
In [17]: s Out[17]: 'TEST' In [18]: chr((reduce(operator.xor, bytearray(s), 0) + 0x80) & 0xff) Out[18]: '\x96'
Das sieht verdammt gut aus, Vielen dank... Frage: Warum "& 0xff"???
@snafu:
Ich habe hier ein Messgerät (Kraft-Weg-Überwachung) und von dem möchte ich die Messwerte abholen.
Die Befehle zum Abholen verlangen seitens des Messgerätes einen Blockcheck der je nach Befehl ermittelt und mit gesendet werden muss.
Ich find's auch etwas übertrieben aber es lässt sich im Messgerät leider nicht deaktivieren.
Jeder Befehl besteht aus einem String, zu Vereinfachung habe ich hier mal "TEST" genommen... sieht dann natürlich etwas umfangreicher aus.
@SVblue: Weil am Ende ein Bytewert heraus kommen muss und +128 ja auch Ergebnisse haben kann die grösser als 255 sind. Also maskiere ich alle Bits über dem 8. aus.