PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Checksummenberechnung (2's complement sum)



Bumbum
18.08.2011, 15:29
Hallo,

ich benötige schon wieder Hilfe. Ich möchte mit einem Barcode-Modul kommunizieren. Speziell handelt es sich um das SE955 von Symbol.

Laut Datenblatt läuft die Kommunikation in Datenpaketen ab, die mit einer Checksumme abgeschlossen werden. Leider werde ich aus den Beispielen und der Beschreibung nicht schlau, wie ich diese Checksumme berechne.

Das erste Byte im Paket ist die Länge in Bytes, ohne die Checksumme. Die letzten beiden Bytes sind die Checksumme. Laut Datenblatt nur als "2's complement sum of message contents excluding checksum" beschrieben.

Hier sind ein paar Beispiel-Pakete aus dem Datenblatt:
05 C7 04 00 FE FE 32
06 C7 04 00 01 9C FE 92
07 C7 04 00 FE 01 9C FD 93
07 C7 04 00 01 9C FE FD 93
05 C7 04 00 04 FF 2C
07 C7 04 00 FE FE FE FC 34
07 C7 04 00 01 01 01 FF 2B

Und hier die Antworten des Moduls dazu. Ich bin mir aber nicht sicher, ob da die Checksumme genauso berechnet wird:

0D C6 00 00 FF 01 00 02 01 9C 07 E6 63 FC 3E
09 C6 00 00 FF 01 00 9C 07 FD 8E
0D C6 00 00 FF 01 00 02 01 9C 07 E6 63 FC 3E
09 C6 00 00 FF 01 00 9C 07 FD 8E
05 C6 00 00 FF FE 36
0D C6 00 00 FF 01 00 02 01 9C 07 E6 63 FC 3E
0B C6 00 00 FF 01 00 01 00 01 00 FE 2D

Irgendwie stehe ich auf dem Schlauch. Egal wie ich rechne, ich komme einfach nicht dahinter, wie diese zwei Bytes Checksumme berechnet werden sollen. Erkennt von euch vielleicht jemand die Logik dahinter, oder kann mit dem Begriff "2's complement sum" etwas anfangen? Die Google Treffer erklären mir immer nur, dass es sich dabei wohl um die binäre Darstellungsweise von negativen Zahlen handelt...

Viele Grüße
Andreas

sternst
18.08.2011, 17:11
oder kann mit dem Begriff "2's complement sum" etwas anfangen?Summe = 05 + C7 + 04 + 00 + FE = 01CE
2er-Komplement(01CE) = FE32

Bumbum
18.08.2011, 19:35
Hallo Stefan,

danke erst mal. Sagst du mir auch wie ich ein 2er-Komplenet berechne? von 0x10000 abziehen?

markusj
18.08.2011, 20:31
Zweierkomplement ist Informatiker-Sprech für "das Vorzeichen umdrehen" bei der heute üblichen Darstellung vorzeichenbehafteter Ganzzahlen. Eine solche Prüfsumme kannst du berechnen, indem du entweder für jedes Datenbyte chksum -= datenbyte berechnest und chksum vorher auf 0 initialisierst, oder aber du addierst einfach alle Datenbytes auf (chksum += datenbyte, chksum vorher wieder auf 0 initialisieren) und änderst dann das Vorzeichen (real_chksum = -chksum)

mfG
Markus

sternst
18.08.2011, 21:09
Sagst du mir auch wie ich ein 2er-Komplenet berechne? von 0x10000 abziehen?Sagtest du nicht, du hättest bereits gegooglet? Da stand mit Sicherheit auch jeweils dabei, wie das Zweierkomplement gebildet wird. Es ist das Inverse + 1.

Bumbum
21.08.2011, 09:25
Hallo Stefan,

das stand da tatsächlich dabei und ich habe es ausprobiert, aber es hat nie gepasst. Meisstens war das Ergebnis um den Wert 1 daneben, manchmal auch völlig. Jetzt ist es logisch.
Ich vermute die völlig daneben Ergebnisse waren wohl Rechenfehler.

Viele Grüße
Andreas