Hallo!
Folgende Frage:
Wie wird die oben genannte CRC berechnet:
P(x) = x^16 + x^15 + x^2 + 1
Das heißt ich habe 6 Bytes einer Nachricht, für diese möchte ich die
16bit CRC errechnen.
z.B.
Byte 0 = 1
Byte 1 = 9
Byte 2 = 254
...
Wie setze ich diese Werte ein? Addiere ich die jeweiligen Werte auf?
Danke, mfg
PS: ich möchte den logischen Rechenweg... nicht Tabellen zum Shiften /
XOR'n ;)
Der CRC ist eine Zustandsmaschine, mit dem CRC als gespeicheter Wert.
Man beginnt mit Null. Dann rechnet man den CRC des ersten bytes und dann
alle anderen bytes. Und der CRC Wert der Nachricht is der Wert der
Maschine am Schluss. Wie man den CRC eines einzelnen Bytes ist klar ?
Das ging ja schnell ;).
"beginnt mit Null" hängt aber nicht mit dem Initwert zusammen, oder?
Dieser wäre 0xFFFF in meinem Fall. Für die einzelnen Bytes würde ich den
Wert jeweils einsetzen...
Dann hab ich z.B. P(1) = 4 und weiter?
Andreas K. schrieb:
> Dann hab ich für jedes Byte eine CRC, was mach ich dann damit?
Die CRC ist ein "mitlaufender Wert". Die für Byte 0 errechnete CRC ist
der neue Startwert für die CRC-Berechnung mit Byte 1, und so weiter.
Das Schema ist wie folgt:
is leider noch nicht angekommen.. ich habe das Polynome, welches nur x
hat. Oder muss ich den aktuellen Wert aus der CRC des vorherigen mit dem
aktuellen Wert kombinieren (jeweils 8Bit) und dann einsetzen!?
Zusätzlich ignoriere ich den Überlauf(e)? (bilde nur eine Funktin ab)
Zusatz (ich bin nicht begeistert von der neuen Editierregelung):
Dein grundsätzlicher Irrtum liegt darin, das Polynom als
Berechnungsformel zu betrachten. Wenn dein erstes Byte den Wert 10 hat,
dann wird nicht diese 10 dort als Wert für x eingesetzt und das Ergebnis
ist dann der CRC. Es ist schon etwas komplizierter. ;-)
okay, zu leicht gedacht...
Anderer Ansatz: ich überprüfe die CRC einer Berechnung auf dem µC und
versuche diese abzubilden. Hierzu bräuchte ich das Generatorpolynom.
Aktuell hab ich nur eine generierte Tabelle gegeben.
Wie bringe ich: P(x) = x^16 + x^15 + x^2 + 1 in den Zusammenhang?
Andreas K. schrieb:
> Wie bringe ich: P(x) = x^16 + x^15 + x^2 + 1 in den Zusammenhang?
2^16 + 2^15 + 2^2 + 1 = 0x18005
Davon laesst du das MSB weg und du erhaelst 0x8005.
Ist die erste Zeile der CRC Tabelle vielleicht
Der folgende Code ist von pycrc generiert und sollte dir deinen CRC
berechnen. Vor ein paar Tagen hat peda hier einen code gepostet, der
etwas schoener anzuschauen ist, aber letzten Endes aehnlichen
Maschinencode generieren sollte.
Du rufst die CRC Routinen wie folgt auf:
1
crc_tcrc;
2
3
crc=crc_init();
4
// fuer alle Characters (oder Strings) in deinem datagramm: