Hallo,
ich stelle mich schon länger die Frage wie die Ergebnisse der
crc_ccitt_update Funktion zustande kommen.
Zum Testen nehme ich immer folgendes Datenpaket:
1 | uint8_t data[] = {1, 2, 3, 4, 5, 6, 7, 8};
|
Lasse ich dieses Paket von der o.g. Funktion berechnen, kommt als
Ergebniss 0x922b heraus (Startwert 0xFFFF). Lasse ich das gleiche
Datenpaket von div. Hexeditoren oder CRC Rechnern berechnen, geben diese
(übereinstimmend) 0x4792 aus. Z.b. hier:
http://www.lammertbies.nl/comm/info/crc-calculation.html?crc=0102030405060708&method=hex
Warum unterscheiden sich die Ergebnisse ?
Desweiteren habe ich irgendwo mal gelesen, dass die CRC 0x0000 ergibt,
wenn man die CRC eines Blockes hinten mit anhängt. So ergibt das
Datenpaket
1 | uint8_t data[] = {1, 2, 3, 4, 5, 6, 7, 8, 0x2b, 0x92};
|
mit der WinAVR Funktion brav 0x0000 aus, was auch bei den anderen
Rechnern (mit der jeweiligen CRC) funktioniert. Allerdings ist mir
aufgefallen dass man die CRC bei der WinAVR Funktion LSB anhängen muss
(0x922b -> 0x2b, 0x92), bei den anderen Rechnern funktioniert das ganze
nur wenn man die CRC MSB anhängt (0x4792 -> 0x47, 0x92).
Wo liegt also der Unterschied begraben ?
Gruß
Stefan