Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1617 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Calcul complement à 2

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Calcul complement à 2

n°1179775
domos
Posté le 19-08-2005 à 17:09:32  profilanswer
 

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>  
 

Code :
  1. > gcc k8056_set1.c -o k8056_set1
  2. /tmp/ccp7XuN3.o: In function `checksum':
  3. k8056_set1.c:(.text+0x13a): undefined reference to `floor'
  4. collect2: ld returned 1 exit status


 
merci pour toutes info.

mood
Publicité
Posté le 19-08-2005 à 17:09:32  profilanswer
 

n°1179781
_p1c0_
Posté le 19-08-2005 à 17:11:54  profilanswer
 

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 :

Code :
  1. > gcc k8056_set1.c -o k8056_set1
  2. /tmp/ccp7XuN3.o: In function `checksum':
  3. k8056_set1.c:(.text+0x13a): undefined reference to `floor'
  4. collect2: ld returned 1 exit status



 
Faut pas rajouter -lm à la compilation?

n°1179785
Taz
bisounours-codeur
Posté le 19-08-2005 à 17:13:55  profilanswer
 

Asc("S" ) ?

n°1179786
Taz
bisounours-codeur
Posté le 19-08-2005 à 17:14:32  profilanswer
 

int ?

n°1179823
domos
Posté le 19-08-2005 à 18:01:00  profilanswer
 

Taz a écrit :

int ?
Asc("S" ) ?


 
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 :
  1. (255 - ((((a + b + c + d) / 256) - Int((a + b + c + d) / 256)) * 256)) + 1
  2. ( 255 - ( ( ( (13 + 1 + 83 + 50) / 256 ) - Int( (13 + 1 + 83 + 49) / 256 ) ) * 256 ) ) + 1
  3. ( 255 - ( ( ( 147 / 256 ) - Int( 147 / 256 ) ) * 256 ) ) + 1 = 109
  4. ( 255 - ( ( 0,57421875 - Int( 0,57421875 ) ) * 256 ) ) + 1 = 109
  5. ( 255 - ( ( 0,57421875 - 0 ) * 256 ) ) + 1 = 109
  6.   255 - 147 + 1 = 109


 
voilà pour être plus clair.
 
merci

n°1179825
Taz
bisounours-codeur
Posté le 19-08-2005 à 18:02:35  profilanswer
 

et c'est quoi le problème ?

n°1179828
domos
Posté le 19-08-2005 à 18:06:57  profilanswer
 

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'.

n°1179829
Taz
bisounours-codeur
Posté le 19-08-2005 à 18:10:33  profilanswer
 

ben soit tu castes ou tu utilises floor, où tu expliques pourquoi y un putain de float dans un calcul entier de checksum !

n°1179836
masklinn
í dag viðrar vel til loftárása
Posté le 19-08-2005 à 18:20:31  profilanswer
 

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 (http://membres.lycos.fr/angel2k/petrus/xppetrus.gif)


Message édité par masklinn le 19-08-2005 à 18:20:47

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1179838
domos
Posté le 19-08-2005 à 18:23:35  profilanswer
 

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...
 
 

mood
Publicité
Posté le 19-08-2005 à 18:23:35  profilanswer
 

n°1179853
mcjoedassi​n
Posté le 19-08-2005 à 18:51:34  profilanswer
 

(unsigned char) -(13+1+'S'+'1');
?
EDIT: il y a une faute dans ton calcul, un 50 a la place d'un 49


Message édité par mcjoedassin le 19-08-2005 à 18:53:42
n°1179866
domos
Posté le 19-08-2005 à 18:56:34  profilanswer
 

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.
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...


 
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 ?

n°1179913
Emmanuel D​elahaye
C is a sharp tool
Posté le 19-08-2005 à 20:07:23  profilanswer
 

domos a écrit :

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 ?


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')


Message édité par Emmanuel Delahaye le 20-08-2005 à 01:01:26

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1179927
Profil sup​primé
Posté le 19-08-2005 à 20:36:48  answer
 

Int((a + b + c + d) / 256)) * 256)
Diviser par 256 pour remultiplier par 256 ?
 
 :heink:  
 

n°1179937
mcjoedassi​n
Posté le 19-08-2005 à 20:53:08  profilanswer
 

& (1 << 8);
 
resultat sur 1 bit :/

n°1179949
Emmanuel D​elahaye
C is a sharp tool
Posté le 19-08-2005 à 21:06:46  profilanswer
 

mcjoedassin a écrit :

& (1 << 8);
 
resultat sur 1 bit :/


Beuh, ça m'apprendra à ne pas vérifier...

& ((1 << 8) - 1)


Je corrige...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1179993
domos
Posté le 19-08-2005 à 23:00:16  profilanswer
 

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.
 

unsigned checksum_abcd = (~(((a + b + c + d) & (1 << 8)) + 1)) & ((1 << 8) - 1);


(corrigé, merci 'mcjoedassin')


 
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+


Message édité par domos le 19-08-2005 à 23:43:38
n°1180110
sircam
I Like Trains
Posté le 20-08-2005 à 11:27:38  profilanswer
 

Tiens, y'a pas des convertisseurs VB -> C ?
 
[:neowen]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Calcul complement à 2

 

Sujets relatifs
Pb de calcul avec une requête SQL [Résolu] Masquer le deroulement des calcul sous excel
Calcul d'un logaritme népérien(ln) [résolu]N'arrive pas à faire un calcul en c++
calcul du temps processeurtableau: calcul en live de valeur d'un cellule
Calcul du taux de charge d'un serveurCreer et renommer une nouvelle feuille de calcul
calcul matriciel en CCalcul / Variable!
Plus de sujets relatifs à : Calcul complement à 2


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)