Hallo zusammen,
falls hier noch Aufklärungsbedarf sein sollte: bin gestern auch über dieses ecklige Problem gestoplert, und denke, ich habe jetzt nach einigem Lesen die Verwirrung verstanden.
Mein Denkfehler war: der Algorithmus arbeitet zwar mit Bytes, aber da das erste Bit auf dem Draht das LSB ist, müssen alle Bits im Byte gespiegelt werden. Ausserdem wird am Ende nochmal das ganze Ergebnis invertiert und ein Endianess-Tausch vorgenommen.
Punkt 1) 1021 vs. 8408 (NB: gespiegeltes 16-Bit-Wort)
Wenn die Datenbits von Bit 7 nach Bit 0 von rechts kommend nach links in das Register geschoben werden, muss das Ergebnis am Ende noch bitweise gespiegelt werden (0x0001 -> 0x8000, 0x1234 -> 0x2c48). Das läuft dann unter dem Stichwort "reflektiert".
Alternativ: Die Bits von 0 nach 7 von links kommend nach rechts in das CRC-Register schieben und das Polynomwort 0x8408 verwenden.
Punkt 2) Startwert ist 0xffff, am Ende werden aber alle Bits nochmal invertiert, und Low- und High-Byte vertauscht.
Alternativ kann auch (umständlicher) mit Startwert 0x0 gearbeitet und die Invertierung am Schluss gespart werden, dann muss aber jedes einzelne Bit nochmal invertiert werden. Das entspricht dann quasi dem logischen Pegel auf dem Draht, der ja auch invertiert ist. Der Low/High-Byte-Tausch ist vermutlich eher ein historischer Implementierungsfehler, der dann quasi per Standard festgeschrieben wurde.
Hoffe, das hilft...
Ciao
Michael