Fonction pour calculer un checksum CRC16 - Stack Overflow
Je travaille sur une bibliothèque pour assurer une communication fiable, simple via une connexion RS232 ou RS485. Une partie de ce code implique l'utilisation d'une somme de contrôle CRC16 sur les données pour détecter la corruption du bruit de la ligne. J'ai créé une fonction pour calculer une somme de contrôle CRC16, mais il ne semble pas être sortie des valeurs correctes.
Le code pertinent que j'ai écrit peut être trouvé ici.
Je suis venu à la conclusion que ce soit ma compréhension de la façon de calculer une CRC16 est fausse, ou la calculatrice en ligne est faux (l'ancien semble plus probable). Quelqu'un peut-il me dire où je pourrais aller mal?
Il y a plusieurs détails dont vous avez besoin pour « correspondre » avec une mise en œuvre CRC particulier - même en utilisant le même polynôme il peut y avoir des résultats différents en raison des différences mineures dans la façon dont les bits de données sont traitées, en utilisant une valeur initiale particulière pour le CRC (il est parfois zéro, parfois 0xffff), et / ou inversion des bits du CRC. Par exemple, parfois une mise en œuvre fonctionnera à partir des bits d'ordre des octets de données haut, alors que parfois ils vont travailler à partir de l'ordre des bits de haut vers le bas (comme le vôtre actuellement).
En outre, vous devez « pousser » les derniers bits du CRC après avoir exécuté tous les bits de données à travers.
Si vous voulez faire correspondre CRC16 avec 0x8005 polynôme comme indiqué sur la page de la calculatrice lammertbies.nl CRC, vous devez apporter les modifications suivantes à votre fonction CRC:
- a) exécuter les bits de données à travers la boucle CRC à partir du bit le moins significatif au lieu de à partir du bit le plus significatif
- b) pousser les 16 derniers bits du CRC sur le registre CRC après que vous avez terminé avec les données d'entrée
- c) inverser les bits de CRC (je devine que ce bit est un report de réalisations matérielles)
Ainsi, votre fonction pourrait ressembler à:
Cette fonction retourne 0xbb3d pour moi quand je passe « 123456789 ».