[Résolu] Check sum
ancrou
Membre
Bonjour,
Je ne trouve pas l'erreur. vous la voyez ?
L'algo de la norme
Le CRC calculé doit être égal au CRC donné
Et j'ai :
Je ne trouve pas l'erreur. vous la voyez ?
//Calcule du Check sum<br />static BOOL calc(NSData* data, UI16_ crc) {<br /> UI08_ a, b,c;<br /> UI08_ crcL = crc & 0x00ff; //Low byte (least significant) of the 16-bit CRC<br /> UI08_ crcH = (crc >> 8) & 0x00ff; //High byte (most significant) of the 16-bit CRC<br /> UI16_ loop;<br /> for (loop = 0;loop < [data length]; loop++) { <br /> a=a ^ crcH;<br /> crcH=a;<br /> a>>=4;<br /> a=a ^ crcH;<br /> crcH=crcL;<br /> crcL=a;<br /> <br /> //ROTATE a LEFT 4 TIMES<br /> c=a;<br /> c>>=4;<br /> a<<=4;<br /> a|=c;<br /> <br /> b=a; //{ temp save}<br /> <br /> //ROTATE a LEFT ONCE<br /> c=a;<br /> c>>=7;<br /> a<<=1;<br /> a|=c;<br /> <br /> a= a & 0x1f;<br /> crcH=a ^ crcH;<br /> a=b & 0xf0;<br /> crcH=a ^ crcH;<br /> <br /> //ROTATE b LEFT ONCE<br /> c=b;<br /> c>>=7;<br /> b<<=1;<br /> b|=c;<br /> <br /> b=b & 0xe0;<br /> crcL=b ^ crcL;<br /> }<br /> printf("crcH %X \t",crcH);<br /> printf("crcL %X \n",crcL);<br /> printf("crc %X \n",crc);<br /><br /> return (crcL ==(crc & 0x00ff) && crcH ==(crc >> 8) & 0x00ff);<br />}
L'algo de la norme
NOTES:
A = new byte
B = temp byte
CRCHI = High byte (most significant) of the 16-bit CRC
CRCLO = Low byte (least significant) of the 16-bit CRC
START:
FOR A = FIRST_BYTE TO LAST_BYTE IN BLOCK DO:
A = A XOR CRCHI
CRCHI = A
SHIFT A RIGHT FOUR TIMES (ZERO FILL)
A = A XOR CRCHI { I J K L M N O P }
CRCHI = CRCLO { swap CRCHI, CRCLO }
CRCLO = A
ROTATE A LEFT 4 TIMES { M N O P I J K L }
B = A { temp save }
ROTATE A LEFT ONCE { N O P I J K L M }
A = A AND $1F { 0 0 0 I J L L M }
CRCHI = A XOR CRCHI
A = B AND $F0 { M N O P 0 0 0 0 }
CRCHI = A XOR CRCHI { CRCHI complete }
ROTATE B LEFT ONCE { N O P 0 0 0 0 M }
B = B AND $ E0 { N O P 0 0 0 0 0 }
CRCLO = B XOR CRCLO ( CRCLO complete }
DOEND;
Le CRC calculé doit être égal au CRC donné
Et j'ai :
crcH B3 crcL BD
crc 8A3F
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
P.S.: Evite le [data length] à chaque passage dans la boucle; ça doit doubler le temps d'exécution de ta méthode.
Remarque aussi que le calcul ne peut pas porter sur plus de 64 Ko de données (je ne sais pas si ça pose problème).
Merci, j'ai donc une 2ème version. malheureusement, elle ne marche pas
Mes printf du CRC calculés et le CRC donnée sont différents. Avec tous mes fichiers testés.
La limite à 64ko ne me pose pas de problème.
Un calcul de checksum sert à calculer une empreinte caractéristique d'un ensemble de données.
Or dans le 1er exemple: les données de data ne sont pas utilisés.
Dans le 2ème, data n'apparaà®t même plus.
FOR A = FIRST_BYTE TO LAST_BYTE IN BLOCK
n'est pas écrit pour rien.
Il faut que tu arrêtes de bidouiller ton code jusqu'à ce qu'il marche et que tu réfléchisses au rôle de ta fonction, et quelles sont ses entrées et ses sorties. Là , ça marchera tout seul.
Je comprends mieux l'histoire du :crackboom:- Merci pour m'avoir corrigé cette grosse erreur.
Mais ça ne marche toujours pas
J'ai fait un printf de a, les valeurs semblent bonnes (les 1er et les dernières).
J'ai essayé en incluent le CRC dans les données; mais non !
De ne pas faire le swap avec l'histoire de G5 ou Intel, mais non !
...
Mes calculs semblent bon quand je regarde bit à bit
... :why?:
Tu n'es pas très loin, cependant, quelques erreurs:
Ca fait une rotation à droite de 7 bits :P
Pareil pour b.
Pourquoi ça? La doc veut dire que le calcul de CRC ne porte pas sur le champ CRC de la trame.
Grâce à votre programme qui marche nickel, j'ai pu trouver l'erreur.
Le 0x0002 c'était pour faire sauter le block CRC de la frame à analyser.
On peut aussi le faire, avant de le transmettre à la fonction CalculCRC,
Mes c >>= 7 sont correctes c'est comme c = c >> 7
Si vous passez à Nancy, je vous paye un coup à boire (Je suis pas souvent à Paris )
Je suis d'heureux d'avoir pu te rendre service; et j'espère pouvoir visiter un de ces jours cette très belle ville qu'est Nancy...