Forum: Mikrocontroller und Digitale Elektronik CRC16: wahre Checksumme?


von Hegy (Gast)


Lesenswert?

Hi,

schon seit Stunden bin ich schon auf der wahren CRC16-Checksumme fuer
folgende Bytes:

0x08 0x60 0x81 0x98 0xF0 0x81 0x8A

serversniff.de behaupted da kommt 0xDA 0x72 als CRC16 bei raus.
jacksum, so'n Java-Proggi meint, es kommt dabei ebenfalls 0xDA 0x72
bei raus.

Wenn ich aber Peter Danneggers Routine aus
http://www.mikrocontroller.net/forum/read-4-49752.html#89913 nehme,
kommt da 0xDA 0x69 bei raus, auch die AVR-include-utils-crc16.h
_crc16_update Funktion bringt mir genau das Ergebnis.

Jetzt hiess es mal glaubich, wenn ich den gesamten String inkl. CRC16
nochmal durch die CRC16-Maschinerie laufen lasse, soll 0x00 0x00 bei
rauskommen. Bei serversniff.de und auch bei jacksum kommt dann aber
0x7E 0x7E bei raus. Was ist jetzt richtig? Es steht 2:2.......

Ich geh' jetzt ersma inne Firche...
 Hegy

von Egon (der wahre) (Gast)


Lesenswert?

Tja, da gibt es wohl verschiedene Implementationen, einmal die falsche
und einmal die richtige:

http://www.joegeluso.com/software/articles/ccitt.htm

von Mehmet K. (mkmk)


Lesenswert?

Tja, scheint, als ob Microsoft's VFP mit seiner eingebauten Funktion
SYS(2007) ebenfalls die falsche CRC-16 berechnet.
Gut, wenn man sich nicht auf eingebaute Funktionen verlaesst und diese
(soweit als möglich) selbst schreibt.

von Michael O. (odiwan)


Lesenswert?

Hallo,

ich denke beide CRC16 Implementierungen arbeiten für sich gesehen
richtig. Der Entscheidene Punkt ist das Generator Polynom. Das kann bei
den CRC16 Implementierungen ja unterschiedlich sein. Wenn dem so ist
kommen auch verschiedene Ergebnisse raus. Jedes für sich gesehen ist
aber richtig.

CRC-CCITT (CRC-16) = x16 + x12 + x5 + 1
IBM-CRC-16         = x16 + x15 + x2 + 1

Ein weitere Punkt ist Startwert bei der CRC Berechnung 0x0000 oder
0xffff beides ist gebräuchlich, ergibt aber jeweils ein anderes
Ergebnis.

Siehe auch:
http://de.wikipedia.org/wiki/Zyklische_Redundanzpr%C3%BCfung

Tschau
Michael

von Hegy (Gast)


Lesenswert?

Hi,

mit CRC16 meinte ich auch CRC16 und nicht CRC-CCITT. Aber ich habe die
Loesung fuer die unterschiedlichen Ergebnisse gefunden, denn alle
Ergebnisse sind richtig.

Die online-Berechnung bei serversniff,de und auch jacksum, das Java
Proggi rechnen mit einem Startwert von 0, wohingegen die CRC16-Routine
von Danegger oder auch die_crc16_update.h mit einem Startwert von
0xFFFF rechnen. Daher die unterschiedlichen Ergebnisse.

von Markus K. (markus-)


Lesenswert?

CRC16 heißt einfach nur, dass da eine CRC mit 16Bit berechnet wird. Es
gibt da keinen Standard dafür. Das Ding von der CCITT ist natürlich
auch eine CRC16. So wie die von IBM oder Microsoft. Da die
Generator-Polynome unterschiedliche Qualität haben denkt man sich aber
besser nicht einfach eines aus, sondern nimmt ein getestetes. Aus
diesem Grund benutzen die Programmierer z.B. das Polynom aus dem Buch,
aus dem sie den Algorithmus haben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.