Ich bin Programmierer und muss Daten an die Maschine senden, muss aber am Ende der Daten eine Prüfsumme hinzufügen . Kann mir jemand ein Beispiel zeigen, wie es geht, damit ich dann ein Programm schreiben kann, um die Prüfsumme für mich zu berechnen.
Die Regeln: Bitweise Inversion der 1-Byte-Bytesumme beginnend mit dem höchstwertigen Adressbyte und endet mit dem Byte vor der Prüfsumme. (Um eine bitweise Inversion durchzuführen, „exklusiv ODER“ die Ein-Byte-Summe mit FF hex.)
Danke
Kommentare
- Was hat das mit dem Tag zu tun: Leistungselektronik?
Antwort
Die Definition ist ziemlich gut deckt es ab.
Bitweise Inversion der 1-Byte-Summe von Bytes, beginnend mit dem höchstwertigen Adressbyte und endend mit dem Byte vor der Prüfsumme. (Um eine bitweise Inversion durchzuführen, „exklusiv ODER“ die Ein-Byte-Summe mit FF hex.)
Beispiel
- Nachricht „Hallo“ = Hex: 48 65 6C 6C 6F.
- Wenn ich diese mit meiner Windows Calc.exe im Programmiermodus addiere, erhalte ich & h01F4.
- Nehmen Sie das letzte Byte und ignorieren Sie alles andere: & hF4.
- & hF4 XOR & hFF = & h0B – Ihre Prüfsumme.
Um das letzte Bit zu verdeutlichen:
&hF4 = 1111 0100 &hFF = 1111 1111 --------- XOR = 0000 1011 = &h0B
Update
Aus irgendeinem Grund funktioniert es bei mir nicht. Hier habe ich CA 00 01 70 00, ich addiere sie, um 13B zu erhalten, ich nehme das letzte Byte, das 3B und XOR mit FF ist, dann bekomme ich c4, das sich von 8E unterscheidet (ein Beispiel, das ich aus dem Handbuch erhalten habe). Vermisse ich etwas an der Regel?
Bei einer Websuche nach der Regel wurde ein Dokument aus erstellt NESLAB . Auf Seite B-2 lesen wir:
Abbildung 1. Der Prüfsummenbereich ist der einzige Teil, der in der Prüfsumme verwendet wird.
Dies sollte Ihre Verwirrung erklären. Das Hauptzeichen wird nicht in die Berechnung einbezogen. Wenn wir nun CA 00 01 70 00 überprüfen, können wir CA löschen und haben ein paar Nullen, 01 und 70, die sich zu & h71 summieren.
& h71 XOR & FF = & h8E. Voila!
Kommentare
- Danke. Ich war verwirrt über " Bitweise Inversion der 1-Byte-Bytesumme ". Ich wusste nicht, dass es bedeutet, das letzte Byte zu nehmen, aber Sie haben es gelöscht. Vielen Dank !!
- Nur neugierig, warum XOR mit h ' FF? Ist ' nicht dasselbe wie das Invertieren jedes Bits (0- > 1, 1- > 0). Scheint, als würden beide mir dasselbe antun. Dann könnten Sie es als " Bitweise invertiertes Endbyte der Summe aller Bytes in einer Nachricht "
- darstellen Ja, Sie sind korrekt, aber XOR verwendet nur einen Befehl, um alle 8 Bits umzudrehen. Ich kann mir ' keine effizientere Methode vorstellen. Können Sie?
- Aus irgendeinem Grund funktioniert es bei mir nicht. Hier habe ich CA 00 01 70 00, ich addiere sie, um 13B zu erhalten, ich nehme das letzte Byte, das 3B und XOR mit FF ist, dann bekomme ich c4, das sich von 8E unterscheidet (ein Beispiel, das ich aus dem Handbuch erhalten habe). Vermisse ich etwas an der Regel?
- @transistor: Danke für die Klarstellung. Nun, ich kenne die Programmiersprache nicht ', es macht für mich einfach mehr Sinn. Ich weiß in Perl, dass ' nur ~ Variable ist. Ich denke, in der Praxis macht es ' keinen Unterschied,
Antwort
Ihre erforderliche Prüfsumme wird für Daten wie folgt berechnet:
Sie haben nicht das Hauptzeichen 0xCA in die Prüfsumme aufgenommen, sondern nur das schattierte Bytes.
Ein einfaches Stück C-Code zur Berechnung Ihres Beispiels:
int main() { int i; unsigned char cs; unsigned char a[] = {0x00, 0x01, 0x70, 0x00}; cs=0; for (i=0; i< sizeof(a); i++) { cs += a[i]; } cs ^=0xFF; printf("cs = %X \n", cs); return 0; }
Und das Ergebnis ist wie erwartet:
sh-4.3$ gcc -o main *.c sh-4.3$ main cs = 8E
Da ich die Variable cs als vorzeichenloses Zeichen deklariert habe, werden bei jeder Addition die oberen Bits weggeworfen. Das Hinzufügen ist genauso wie bei anderen Beispielen. Sie können die oberen Bits am Ende wegwerfen, wenn Sie dies manuell tun. Seien Sie in diesen Fällen nur sehr vorsichtig, was genau ist und was nicht in der Prüfsumme enthalten ist.