Je suis programmeur et jai besoin denvoyer des données à la machine, mais je dois ajouter une somme de contrôle à la fin des données . Quelquun peut-il me montrer un exemple comment le faire afin que je puisse ensuite écrire un programme pour calculer la somme de contrôle pour moi.
Les règles: Inversion bit à bit de la somme doctets de 1 octet commençant par loctet dadresse le plus significatif et se terminant par loctet précédant la somme de contrôle. (Pour effectuer une inversion au niveau du bit, « OU exclusif » la somme dun octet avec FF hex.)
Merci
Commentaires
- Quest-ce que cela a à voir avec le tag: power-electronics?
Answer
La définition plutôt bien le couvre.
Inversion au niveau du bit de la somme doctets sur 1 octet commençant par loctet dadresse le plus significatif et se terminant par loctet précédant la somme de contrôle. (Pour effectuer une inversion au niveau du bit, « OU exclusif » la somme dun octet avec FF hex.)
Exemple
- Message « Hello » = Hex: 48 65 6C 6C 6F.
- En les ajoutant à laide de mon Windows Calc.exe en mode Programmeur, jobtiens & h01F4.
- Prenez le dernier octet et ignorez tout le reste: & hF4.
- & hF4 XOR & hFF = & h0B – votre somme de contrôle.
Pour clarifier le dernier bit:
&hF4 = 1111 0100 &hFF = 1111 1111 --------- XOR = 0000 1011 = &h0B
Mise à jour
Pour une raison quelconque, cela ne fonctionne pas pour moi. Ici, jai CA 00 01 70 00, je les additionne pour obtenir 13B, je prends le dernier octet qui est 3B et XOR avec FF, puis jobtiens c4, qui est différent de 8E (un exemple que jai obtenu du manuel). Est-ce que je manque quelque chose à propos de la règle?
Une recherche sur le Web de la règle a renvoyé un document de NESLAB . À la page B-2, nous lisons:
Figure 1. La région de la somme de contrôle est la seule partie utilisée dans la somme de contrôle.
Cela devrait expliquer votre confusion. Le caractère principal nest pas inclus dans le calcul. Maintenant, si nous effectuons une vérification sur CA 00 01 70 00, nous pouvons abandonner CA et nous retrouverons avec quelques zéros, 01 et 70 qui se résument à & h71.
& h71 XOR & FF = & h8E. Voila!
Commentaires
- Merci. Jétais confus à propos de " Inversion au niveau du bit de la somme de 1 octet doctets ". Je ne savais pas que cela signifie prendre le dernier octet, mais vous lavez effacé. Merci beaucoup !!
- Juste curieux, pourquoi XOR avec h ' FF? Nest-ce pas ' que cela revient à inverser simplement chaque bit (0- > 1, 1- > 0). On dirait que les deux me font la même chose. Ensuite, vous pouvez le représenter comme " Octet final inversé au niveau du bit de la somme de tous les octets dun message "
- Oui, vous avez raison, mais XOR nutilise quune seule instruction pour inverser les 8 bits. Je ne peux ' penser à une méthode plus efficace. Pouvez-vous?
- Pour une raison quelconque, cela ne fonctionne pas pour moi. Ici, jai CA 00 01 70 00, je les additionne pour obtenir 13B, je prends le dernier octet qui est 3B et XOR avec FF, puis jobtiens c4, qui est différent de 8E (un exemple que jai obtenu du manuel). Est-ce que je manque quelque chose à propos de la règle?
- @transistor: Merci davoir clarifié. Eh bien, je ne ' ne connais pas le langage de programmation, cela a plus de sens pour moi comme ça. Je sais quen perl, il ' est juste ~ variable. Je suppose que dans la pratique, cela ne fait ' aucune différence de toute façon
Réponse
La somme de contrôle requise est calculée sur les données comme suit:
Vous nincluez pas le caractère principal 0xCA dans la somme de contrôle, uniquement le caractère ombré octets.
Un simple bout de code C pour calculer votre exemple:
int main() { int i; unsigned char cs; unsigned char a[] = {0x00, 0x01, 0x70, 0x00}; cs=0; for (i=0; i< sizeof(a); i++) { cs += a[i]; } cs ^=0xFF; printf("cs = %X \n", cs); return 0; }
Et le résultat est comme prévu:
sh-4.3$ gcc -o main *.c sh-4.3$ main cs = 8E
Depuis que jai déclaré la variable cs comme un caractère non signé, il jette les bits supérieurs à chaque addition. Lajout est identique à dautres exemples, vous pouvez jeter les bits supérieurs à la fin si vous le faites manuellement. Faites juste très attention dans ces cas à ce que est et ce qui nest pas inclus dans la somme de contrôle.