Stack-Überlauf - Funktion, um ein CRC16-Prüfsumme zu berechnen

Ich arbeite an einer Bibliothek einfach eine zuverlässige Kommunikation über eine RS232- oder RS485-Verbindung zur Verfügung zu stellen. Ein Teil dieses Code beinhaltet ein CRC16-Prüfsumme über die Daten unter Verwendung von Korruption von Leitungsrauschen zu erkennen. Ich habe eine Funktion erstellt ein CRC16-Prüfsumme zu berechnen, aber es scheint nicht korrekte Werte zu sein ausgibt.







Der entsprechende Code, den ich geschrieben habe, ist hier zu finden.

Ich bin zu dem Schluss gekommen, dass entweder mein Verständnis davon, wie eine CRC16 falsch zu berechnen ist oder der Online-Rechner ist falsch (ersteres scheint wahrscheinlicher). Kann mir jemand sagen, wo ich schief gehen könnte?

Es gibt mehrere Details, die Sie brauchen, um ‚zusammenpassen‘ mit für eine bestimmte Implementierung CRC - sogar die gleiche Polynom es mit unterschiedlichen Ergebnissen sein kann wegen geringfügiger Unterschiede, wie Datenbits gehandhabt wird, einen bestimmten Anfangswert für die CRC mit (manchmal ist es Null, manchmal 0xFFFF) und / oder die Bits des CRC zu invertieren. Zum Beispiel wird manchmal eine Implementierung von den niederwertigen Bits Arbeit der Daten auf Bytes, während manchmal werden sie arbeiten, von der hohen Ordnung nach unten Bits (wie Sie zur Zeit der Fall ist).







Außerdem müssen Sie zu ‚schieben‘ die letzten Bits des CRC, nachdem Sie alle Datenbits durch haben laufen.

Wenn Sie die CRC16 mit Polynom 0x8005 übereinstimmen soll, wie auf der lammertbies.nl CRC-Rechner Seite gezeigt, müssen Sie die folgenden Änderungen an der CRC-Funktion machen:

  • a) die Datenbits durch die CRC-Schleife laufen von dem niedrigstwertigen Bit ausgehend anstatt aus dem höchstwertigen Bit
  • b) drücken Sie die letzten 16 Bits des CRC aus dem CRC-Register, nachdem Sie mit dem Eingangsdaten beendet haben
  • c) umgekehrt die CRC-Bits (Ich vermute, dieses Bit wird ein Übertrag von Hardware-Implementierungen)

So könnte Ihre Funktion wie folgt aussehen:

Diese Funktion gibt 0xbb3d für mich, wenn ich in „123456789“ übergeben.







In Verbindung stehende Artikel