CRC8 bei mehreren Bytes? Denkfehler?

#1062138
Lesenswert?

Hallo,

grundsätzlich ist mir klar wie CRC funktioniert und ich krieg es auch 
für ein Byte auf dem Papier hin. Und bevor die schlauen "Frag doch 
<Wissensdatenbank bzw. Suchmaschine deiner Wahl>"-Posts kommen möchte 
ich meine Frage doch konkretisieren:

Ich habe einen CRC8 (0x99) und 8 Bytes Nutzdaten. Ich fange also an das 
erste Byte zu nehmen und an diesem den CRC-Algorithmus anzuwenden. Hänge 
ich dann an jedes Byte für die Berechnung separat erstmal die 7 Nullen 
an (Anzahl Bits in Generatorpolynom - 1) oder nehme ich statt der Nullen 
die 7 Bits des nachfolgenden Bytes und hangle mich bis zum 8. Byte durch 
und füge diese 7 Nullen erst am Ende des 8. Nutzdaten-Bytes an?

Oder wird die CRC für jedes Byte seperat durchgeführt und die jeweiligen 
Divisionsreste irgendwie aufaddiert?

Zwar steht in der Wikipedia eine C-Referenz-Implementierung, doch auch 
diese beantwortet mir nicht meine Frage, da wiedermal nur 8 Bits 
genommen werden grr.

Ich hoffe ihr könnt mir kurz auf die Sprünge helfen ...
Vielen Dank!
#1062151
Lesenswert?

@  Alex Wurst (daedalus)

>ich dann an jedes Byte für die Berechnung separat erstmal die 7 Nullen
>an

NEIN!

> (Anzahl Bits in Generatorpolynom - 1) oder nehme ich statt der Nullen
>die 7 Bits des nachfolgenden Bytes und hangle mich bis zum 8. Byte

JA!

> durch
>und füge diese 7 Nullen erst am Ende des 8. Nutzdaten-Bytes an?

ja, dort steht im allgemeinen die CRC, welche bei der Berechnung mit 
Null gefüllt ist.

>Oder wird die CRC für jedes Byte seperat durchgeführt

NEIN.

Siehe CRC und

http://www.employees.org/~surendra/asic/crc.html

MfG
Falk
#1062158
Lesenswert?

Super, das war sehr hilfreich!

Nun noch eine Frage:
Wäre es sinnvoll die 8 Bytes in EINEN Datentyp zu packen? z.B. 
uint64_t oder gibt es eine hübsche Methode wie ich mich z.B. durch einen 
char-Array hangeln kann? Ich kann ja nicht ohne "<<" und 
">>"-Kunststücken bit-genau adressieren?

Also quasi nach dem Motto "das Bit was du jetzt hinten anhängst, ist das 
5. Bit vom 2. Byte im Datenstrom der aus 8 Bytes besteht".

Wie gehe ich dann vor wenn ich z.B. über 256 Bytes eine CRC8-Prüfsumme 
durchführen will die möglichst effizient arbeitet? (z.B. auf einem 8-Bit 
µC mit wenig RAM und Rechenleistung).
#1062179
Lesenswert?

@  Alex Wurst (daedalus)

>Wäre es sinnvoll die 8 Bytes in EINEN Datentyp zu packen? z.B.
>uint64_t

Nein.

> oder gibt es eine hübsche Methode wie ich mich z.B. durch einen
>char-Array hangeln kann?

Ne For Schleife?

>Ich kann ja nicht ohne "<<" und
">>"-Kunststücken bit-genau adressieren?

Abse sicher, Schiebeoperatioen sind die Grundlage der CRC.

>Wie gehe ich dann vor wenn ich z.B. über 256 Bytes eine CRC8-Prüfsumme
>durchführen will die möglichst effizient arbeitet?

Möglichst Clever.

> (z.B. auf einem 8-Bit
>µC mit wenig RAM und Rechenleistung).

Hab ich mal in ASM in verschiedensten Variabten durchgespielt, siehe 
Anhang.
Such dir deine Lieblingsroutine aus und konvertier sie in C.

MFG
Falk
Angehängte Dateien:

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