calcul de checksum (réglé) - Divers - Programmation
Marsh Posté le 20-10-2018 à 18:23:46
Pourquoi 99,99 % ?
Les données sont-elles bonnes ?
Marsh Posté le 20-10-2018 à 18:38:51
De toute façon ça ne veut rien dire "les deux compléments à xxx". Il n'y a qu'un complément à 256 même si ça se représente par 2 caractères en hexa.
Marsh Posté le 20-10-2018 à 19:01:32
MaybeEijOrNot a écrit : De toute façon ça ne veut rien dire "les deux compléments à xxx". Il n'y a qu'un complément à 256 même si ça se représente par 2 caractères en hexa. |
C'est pas "deux compléments" mais le complément à 2, à différencier du complément à 1.
MaybeEijOrNot a écrit : Pourquoi 99,99 % ? |
Le tout à transité à travers une liaison série, il y a donc une possibilité de corruption mais elle est très petite.
Citation : Les données sont-elles bonnes ? |
Oui.
Marsh Posté le 20-10-2018 à 20:06:21
rat de combat a écrit : C'est pas "deux compléments" mais le complément à 2, à différencier du complément à 1. |
Non mais en plus c'est ce que j'ai fait. xD
Marsh Posté le 21-10-2018 à 16:36:21
J'arrive au même résultat que toi. Ca serait bien d'être sûr des données de base (paquet de bit et checksum).
Pour info en calculant le modulo 255 au lieu de 256 j'arrive à F7 (qui ressemble beaucoup à F8, mais c'est peut être un hasard total )
Test à l'arrache en C# (avec 255) :
Code :
|
Ca dit :
Sum : 2304
Mod hexa : 09
Complement à 2 : F7
Marsh Posté le 21-10-2018 à 17:34:47
Si tu fais la somme de tous tes octets, que tu fais ta somme modulo 255 puis le complément à 257 ça fonctionne. Mais ça n'a en effet aucun sens si ce n'est peut être l'erreur de croire que le complément à 2 pour 1 octet serait le complément à 255+2 (au lieu de 255+1).
Marsh Posté le 21-10-2018 à 17:39:45
Ca revient à mon exemple si je te suis bien. Mais effectivement ça demande beaucoup de changements un poil arbitraires .
Comme je disais il faudrait vérifier la validité de l'exemple d'origine, ou à défaut en avoir d'autres (trame + checksum) pour vérifier si on arrive à trouver systématiquement les même résultats concordant.
Marsh Posté le 21-10-2018 à 17:45:09
Merci pour vos réponses, je vais regarder ça courant semaine prochaine.
Marsh Posté le 21-10-2018 à 17:46:12
Sinon à la place de prendre le reste de la somme modulo 255 tu peux aussi retenir le nombre de fois que ta somme est divisible par 256, ça donne aussi 9...
EDIT : une autre trame + checksum devrait trancher.
Marsh Posté le 21-10-2018 à 17:53:34
Ah ouais tiens, 2304 / 256 ça fait aussi 9, marrant. Mais avec le complément à deux ça ne fait toujours pas F8 et surtout c'est bizarre pour un checksum puisque ça viendrait ignorer tte la partie décimale (au contraire du modulo), donc aucun intéret IMHO !
Marsh Posté le 21-10-2018 à 17:57:50
Ah oui ça serait clairement catastrophique pour un checksum de faire ça, cela impliquerait que des petits changements permettrait d'obtenir le même checksum.
Marsh Posté le 21-10-2018 à 23:12:10
>j'obtiens 0x900 soit 0x00 après modulo 256 ce qui n'a strictement rien à voir avec 0xF8.
Perso, ça me semble bon.
Pour le checksum de la somme, tu peux faire
$checksum=((($sum^255)+1)&255);
A+,
Marsh Posté le 22-10-2018 à 20:18:57
Bon, j'ai généré une autre trame et j'ai trouvé, c'était vraiment tout bête: J'ai pris le mauvais octet... En fait le F8 je ne sais pas ce qu'il vient faire là, le checksum c'est 0C (l'octet d'avant) et du coup ça colle. Je l'avais pris pour un \r ou \n (je sais plus) dans le champ précédant, pas de chance que ça tombe sur cette valeur...
Merci pour votre aide.
Marsh Posté le 20-10-2018 à 17:09:27
Bonjour ,
J'ai un problème avec un calcul de checksum / vérification de l'intégrité d'un paquet de données. C'est pourtant tout bête mais je dois avoir un blocage dans mon cerveau...
Le checksum est défini ainsi:
the two's complement of the modulo 256 sum of all the octets in the message
Voici les données en hexa:
80 24 02 0A 30 31 32 33 34 35 36 37 38 39 01 08 30 31 30 31 30 31 30 31 07 0C 4E 65 75 66 62 6F 78 20 54 65 73 74 0C
Et le checksum correct à 99,99%: 0xF8
Pourtant si j'ajoute tout les octets
j'obtiens 0x900 soit 0x00 après modulo 256 ce qui n'a strictement rien à voir avec 0xF8.
J'arrive pas à trouver l'erreur, un coup de main svp.
Message édité par rat de combat le 22-10-2018 à 20:19:10