Conversion Decimal to binary et inversement.

Conversion Decimal to binary et inversement. - C - Programmation

Marsh Posté le 05-03-2009 à 15:55:11    

Bonjour,
je bosse actuellement sur un projet et je dois convertir la valeur d'un char (man ascii) en  binaire.
exemple : "cool" en ascii sa donne (99 111 111 108) il me reste plus qu'a transformer 99 en binaire.
J'ai donc recoder une fonction appeler get_number_base, cependant il me renvoi un peu n'importe quoi.
 
J'ai aussi parcourus le web et plus particulierement le forum, je suis tomber sur ce post :
http://forum.hardware.fr/hfr/Progr [...] 2330_1.htm
 
ma fonction getnbr me renvoi constamment -15... je poste le code de cette fonction si quelqu'un veut bien jeter un cou d'oeil ^^
(en aucun cas je demande qu'on me fasse mon boulot, juste qu'on me debloque).
 

Code :
  1. int     get_pos_in_base(char c, char *base)                                                                             
  2. {                                                                                                 
  3.   int   position;                                                                                                       
  4.                                                                                                                  
  5.   position = 0;                                                                                                         
  6.   while (*(base + position) && *(base + position) != c)                                                                 
  7.     position++;                                                                                                         
  8.   if (*(base + position))                                                                                               
  9.     return (position);                                                                                                   
  10.   else                                                                                                                   
  11.     return (-1);                                                                                                         
  12. }                                                                                                                       
  13.                                                                                                                          
  14. int     my_getnbr_base(char *str, char *base)                                                                           
  15. {                                                                                                                       
  16.   int   res;                                                                                                             
  17.   int   base_len;                                                                                                       
  18.                                                                                                                          
  19.   if (*str == '-')                                                                                                       
  20.     return (-my_getnbr_base(str + 1, base));                                                                             
  21.   if (*str == '+')                                                                                                       
  22.     return (my_getnbr_base(str + 1, base));                                                                             
  23.   base_len = my_strlen(base);                                                                                           
  24.   res = 0;                                                                                                               
  25.   while (*str)                                                                                                           
  26.     {                                                                                                                   
  27.       res *= base_len;                                                                                                   
  28.       res += get_pos_in_base(*str, base);                                                                               
  29.       str++;                                                                                                             
  30.     }                                                                                                                   
  31.   return (res);                                                                                                         
  32. }


 
 
Merci les codeurs fou ^^
Leoz


---------------
Worldcraze 10loop
Reply

Marsh Posté le 05-03-2009 à 15:55:11   

Reply

Marsh Posté le 05-03-2009 à 16:40:46    


Oué, déjà définit précisément ce que tu entends par "convertir en binaire". Parce que si tu regardes un entier dans la mémoire d'un ordinateur, bah, c'est déjà en binaire. Si maintenant tu cherches à convertir un entier (int) en l'équivalent binaire sous forme de chaine de caractère, bah alors là ton algo est complètement à coté de la plaque.
 
Ça serait plutôt un truc du genre :

Code :
  1. static void print_binary(int nb)
  2. {
  3.     char buffer[65];
  4.     char * p = buffer + sizeof buffer - 1;
  5.     unsigned int i = nb;
  6.     *p-- = 0;
  7.     while (i != 0)
  8.     {
  9.         *p-- = (i & 1) + '0';
  10.         i >>= 1;
  11.     }
  12.     printf("%s", p + 1);
  13. }

Reply

Marsh Posté le 05-03-2009 à 16:49:53    

Enfait la man ascii disponible sous freebsd ne comporte pas la valeur de chaque caractère en binaire uniquement en hexa, decimal et octal.
 
Je vais essayer ta methode mais j'ai finalement reussi a le recoder et sa me permet de rentre la base que j'ai decider au prealable ^^
 
il ne me reste plus qu'a retourner la valeur.
 
Merci de ton aide :)
 


---------------
Worldcraze 10loop
Reply

Marsh Posté le 05-03-2009 à 17:11:02    

Enfait je suis de retour ^^
Je print bien les nombres mais si je rentre 49 (le caractere ascii) de chiffre 1 je devrais obtenir 00110001 mais j'obtiens 110001.

 

Lorsque j'utilise ma fonction get_nbr_base pour convertir 110001 en decimale cela me retourne 110001, idem pour 00110001... une idee ?

 


Message édité par leoz2004 le 05-03-2009 à 17:11:33

---------------
Worldcraze 10loop
Reply

Marsh Posté le 05-03-2009 à 17:30:12    

Hmm, 00110001b == 110001b, les zéros de poids fort ne servent à rien (à moins que tu cherches à concaténer une suite de nombre binaire sans séparateur). Si tu veux un padding sur un nombre multiple de huit caractères, tu peux faire un truc du genre:

Code :
  1. static void print_binary(int nb)
  2. {
  3.     char buffer[65];
  4.     char * p = buffer + sizeof buffer - 1;
  5.     unsigned int i = nb;
  6.     *p-- = 0;
  7.     while (i != 0)
  8.     {
  9.         *p-- = (i & 1) + '0';
  10.         i >>= 1;
  11.     }
  12.     while ((p - buffer + 1) & 7) *p-- = '0';
  13.     printf("%s", p + 1);
  14. }

Reply

Marsh Posté le 05-03-2009 à 17:41:52    

Justement j'aimerais passer a ma fonction une chaine de caractere qui comprend  64 carractere
(001100010100110010011100011011100011100011011001110011110011000110)
En gros des qu'il rencontre un 0 il envoi un SIGUSR1 et si il rencontre un 1 il envoi SIGUSR2, le probleme c'est que si je souhaite envoyer 10 et 0 je vais lui passer la chaine 100 qui est enfait 4 ^^


---------------
Worldcraze 10loop
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed