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!
@ 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
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).
@ 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