Calcul complement à 2 - C - Programmation
Marsh Posté le 19-08-2005 à 17:11:54
domos a écrit : Sinon, je n'ai pas trouvé de fonction équivalente à 'int'. |
Je suppose que c'est pour faire un cast : (int) devant la parenthèse
domos a écrit :
|
Faut pas rajouter -lm à la compilation?
Marsh Posté le 19-08-2005 à 18:01:00
Taz a écrit : int ? |
Int en basic donne la partie entière de la division.
asc("S" ) est le code asccii de 'S'
Ci-dessous exemple en basic (a,b,c,d sont 4 octets):
Code :
|
voilà pour être plus clair.
merci
Marsh Posté le 19-08-2005 à 18:06:57
Taz a écrit : et c'est quoi le problème ? |
je cherche à faire l'équivalent en C, sachant que je ne trouvais pas de fonction équivalente à 'Int'.
Marsh Posté le 19-08-2005 à 18:10:33
ben soit tu castes ou tu utilises floor, où tu expliques pourquoi y un putain de float dans un calcul entier de checksum !
Marsh Posté le 19-08-2005 à 18:20:31
Il fait des divisions, je présumme que le VB convertit les divisions d'entiers en flottants quand le résultat n'est pas entier ()
Marsh Posté le 19-08-2005 à 18:23:35
Taz a écrit : ben soit tu castes ou tu utilises floor, où tu expliques pourquoi y un putain de float dans un calcul entier de checksum ! |
Le calcul est fourni en exemple en VB pour envoyer des commandes sur une carte (kit velleman) par le port série.
Il y a 4 octets à envoyer à la carte + le checksum calculé comme dans l'exemple que j'ai donné.
Je suppose qu'il on fait comme cela dans le cas ou la somme (a+b+c+d) est supérieur à 256, le checksum serais négatif si il n'y avait la soustraction de la partie entière..
C'est pourquoi je cherchais une solution + simple en C...
Marsh Posté le 19-08-2005 à 18:51:34
(unsigned char) -(13+1+'S'+'1');
?
EDIT: il y a une faute dans ton calcul, un 50 a la place d'un 49
Marsh Posté le 19-08-2005 à 18:56:34
domos a écrit : Le calcul est fourni en exemple en VB pour envoyer des commandes sur une carte (kit velleman) par le port série. |
Je pense avoir trouvé.
en fait le calcul :
( 255 - ((((a + b + c + d) / 256) - Int((a + b + c + d) / 256)) * 256)) + 1 |
revient à
( 255 - ((a+b+c+d) modulo 256) ) + 1 |
ce qui devrai être + simple à coder
votre avis ?
Marsh Posté le 19-08-2005 à 20:07:23
domos a écrit : Je pense avoir trouvé.
|
C'est mieux. Effectivement, le checksum 8 bits c'est bien la somme modulo 256. Pour le complément à deux, on fait + 1 et on inverse les bits.
unsigned checksum_abcd = (~(((a + b + c + d) & ((1 << 8) - 1)) + 1)) & ((1 << 8) - 1); |
(corrigé, merci 'mcjoedassin')
Marsh Posté le 19-08-2005 à 20:36:48
Int((a + b + c + d) / 256)) * 256)
Diviser par 256 pour remultiplier par 256 ?
Marsh Posté le 19-08-2005 à 21:06:46
mcjoedassin a écrit : & (1 << 8); |
Beuh, ça m'apprendra à ne pas vérifier...
& ((1 << 8) - 1) |
Je corrige...
Marsh Posté le 19-08-2005 à 23:00:16
Emmanuel Delahaye a écrit : C'est mieux. Effectivement, le checksum 8 bits c'est bien la somme modulo 256. Pour le complément à deux, on fait + 1 et on inverse les bits.
|
Je n'ai pas réussi à obtenir les bons résultats avec ta méthode mais je m'en suis inspiré pour y arriver.
j'ai obtenu cela:
checksum = ~((a + b + c + d) & 0xFF) + 1 ; |
Merci à tous pour votre aide
a+
Marsh Posté le 20-08-2005 à 11:27:38
Tiens, y'a pas des convertisseurs VB -> C ?
Marsh Posté le 19-08-2005 à 17:09:32
Bonjour,
Débutant en C,
je voudrais concertir en C, un calcul tiré d'un programme en VB.
calcul de checkum (complement à 2 de la somme de 4 octets + 1).
Voici le calcul en VB:
checksum = (255 - ((((13 + address + Asc("S" ) + Asc("1" )) / 256) - Int((13 + address + Asc("S" ) + Asc("1" )) / 256)) * 256)) + 1
(address=1)
N'y a a t'il pas un moyen plus simple pour le faire en C ?
Sinon, je n'ai pas trouvé de fonction équivalente à 'int'.
La fonction "double floor(double x);" n'est pas trouvée par le compilateur même avec
#include <math.h>
merci pour toutes info.