Char en Int

Char en Int - C++ - Programmation

Marsh Posté le 27-03-2012 à 11:01:58    

Bonjour,  
 
En communiquant avec une radio via une liaison série RS232, je reçois une trame qui m'envoie la force du signal reçu.  
La trame se présente sous cette forme : 0xfe 0xfe 0xe0 0x6c 0x15 0x02 0x01 0x28 fd  
La force du signal est traduite par 0x01 et 0x28, qui indique un signal de 128.  
J'ai bien essayé le atoi() et strtol(), mais ça renvoie systématiquement 0.
Débutant en C/C++, je ne sais pas du tout comment je pourrais à partir de ces deux caractères, obtenir un entier.  
 
Merci de votre aide !

Reply

Marsh Posté le 27-03-2012 à 11:01:58   

Reply

Marsh Posté le 27-03-2012 à 11:31:22    

ben bitshifts dans ce cas ?

 

Si t'as char a = 0x01 et b = 0x28,
 int c = a+(b>>8) ça le fait pas ?

 

(au passage, atoi() et strol() c'est chaine de caractère-> décimal, par exemple char*chaine = "128", int a = atoi(chaine) )

Message cité 1 fois
Message édité par Terminapor le 27-03-2012 à 11:32:23

---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 30-03-2012 à 13:22:38    

Terminapor a écrit :

ben bitshifts dans ce cas ?
 
Si t'as char a = 0x01 et b = 0x28,
 int c = a+(b>>8) ça le fait pas ?
 
(au passage, atoi() et strol() c'est chaine de caractère-> décimal, par exemple char*chaine = "128", int a = atoi(chaine) )


(b>>8) == 0
 
Si on a bien l'entrée en hexa, qui indique un nombre en décimal, je pense que c'est plus un truc du genre
 
char strb[4];
sprintf(strb, "%x", b);
int result = 10*a + atoi(strb); // si a < 10, pas besoin de passer par un sprintf / atoi comme pour b
(faudra penser à tester que b est un nombre hexa ne comportant pas de lettres, atoi ne passera pas sinon)
 
edit: sinon si l'entrée et la sortie sont dans la meme base, le bitshift est la bonne solution
unsigned char a, b;
int c = (((int)a)<<8)+b;


Message édité par Iradrille le 30-03-2012 à 13:26:50
Reply

Marsh Posté le 30-03-2012 à 13:41:57    

Citation :

La force du signal est traduite par 0x01 et 0x28, qui indique un signal de 128.


 
BCD compacte, il n'y a pas de fonction standard pour decoder ca.
 

Code :
  1. v = (a[0] >> 4 & 0x0F) * 1000 + (a[0] & 0x0F) * 100 + (a[1] >> 4 & 0x0F)*10 + (a[1] & 0x0F);


 
plus les verifications de validite qui vont bien.
 


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Sujets relatifs:

Leave a Replay

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