String byteweise "verXORen"

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
SVblue
User
Beiträge: 15
Registriert: Montag 3. Februar 2014, 15:48

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. :oops:
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
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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?
BlackJack

Code: Alles auswählen

In [17]: s
Out[17]: 'TEST'

In [18]: chr((reduce(operator.xor, bytearray(s), 0) + 0x80) & 0xff)
Out[18]: '\x96'
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Achso, es ging um die programmiermäßige Umsetzung, an der es gescheitert ist und das Rechenbeispiel gehörte zur Aufgabenstellung, oder wie? Scheint wohl noch etwas zu früh für mich zu sein... :oops:
SVblue
User
Beiträge: 15
Registriert: Montag 3. Februar 2014, 15:48

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.
BlackJack

@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.
Antworten