Checksumme Berechnen C++

Gast #4454193
Lesenswert?

Hallo,

Zur Kommunikationsabsicherung zwischen zwei Steuergeräte muss ich die 
Botschafts-Checksumme berechnen und mit dem Signal Signal_CRC 
übertragen.

Dafür muss ich eine C++-Funktion schreiben was ich leider nicht kann.

Ich habe sowieso Verständnis-Probleme was die Checksumme-Berechnung 
angeht:-(. Warum verwendet man für die Berechnung bzw. für die 
Programmierung eine LUT (Lookup-Tabelle)?

Könnte jemand hier helfen?

Danke!

Gruß
Stefan
#4454197
Lesenswert?

@ Stefan (Gast)

>Dafür muss ich eine C++-Funktion schreiben was ich leider nicht kann.

Das kann man lernen. Siehe CRC. Die Theorie ist nice to know, kann 
man aber erstmal überspringen. Entscheidend ist nur der Ablauf. Der wird 
hier recht gut erklärt.

http://www.ross.net/crc/download/crc_v3.txt

>Ich habe sowieso Verständnis-Probleme was die Checksumme-Berechnung
>angeht:-(. Warum verwendet man für die Berechnung bzw. für die
>Programmierung eine LUT (Lookup-Tabelle)?

Das kann man machen, muss aber nicht. Der Vorteil ist die deutlich 
höhere Geschwindigkeit.
Gast #4454202
Lesenswert?

Stefan schrieb:
> Warum verwendet man für die Berechnung bzw. für die
> Programmierung eine LUT (Lookup-Tabelle)?

z.B. Weil Steuergeräte oft "kleine" µCs enthalten, bei denen man gerne 
Speicherplatz und Rechenzeit spart.

Eine uint8_t->uint8_t LUT braucht 256 Bytes im ROM, kann in konstanter 
Zeit ausgelesen werden, und braucht kaum RAM/Stack.
Gast #4454224
Lesenswert?

Musst Du den CRC unbedingt selbst implementieren?

Gibts aeltere Projekte in der Organisation? Ab einer gewissen Groesse 
des Projekts findet sich meist irgendwo irgendeine CRC-Implementierung 
in sagen wir "crc16.h" und "crc16.c", mit dem Namen eines nicht mehr 
dort arbeitenden Kollegen im Header, und natuerlich nicht angegeben, 
welches CRC-Polynom, welcher Startwert, wieherum die Bits gefuettert 
werden und ob nachher noch etwas ge-XOR-t wird.

Ansonsten braucht man auch keine LUT, wenn man genug Zeit hat. LUT ist 
nur eine Optimierung. Ohne LUT muss man halt Bits einzeln herausshiften.
Gast #4455574
Lesenswert?

Die einfachste Methode, die ich kenne geht folgendermaßen. Ich hoffe der 
Pseudocode ist verständlich. Wichtig ist, dass ChkA und ChkB UINT8 sind 
und Überläufe nicht abgefangen werden:

UINT8 chkA=0;
UINT8 chkB=0;

for (idx=0...bufferlength-1) {
  chkA+=buffer[idx];
  chkB+=chkA;
}

Die hat auch einen Namen. Fällt mir gerade nicht ein. Wird z.B. im 
binären Protokoll von UBLOX-GPS-Empfängern benutzt.
#4455725
Lesenswert?

@ CaptainAlbern (Gast)

>Die einfachste Methode, die ich kenne geht folgendermaßen. Ich hoffe der
>Pseudocode ist verständlich. Wichtig ist, dass ChkA und ChkB UINT8 sind
>und Überläufe nicht abgefangen werden:

Es geht hier nicht um ein primitivste PrüfSUMME sondern um einen ECHTEN 
CRC, aka Cyclic Redundancy Check.
Gast #4455739
Lesenswert?

'Checksumme' ist denglisch und könnte auf deutsch aber 'Prüfsumme' 
heissen.
Genauere Angaben wurden ja nicht gemacht, als Informatiker könnte man 
den TO jetzt noch weiter nach Hamming Distanz fragen, ob und wieviele 
Bitfehler korrigiert werden sollen...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren