Conversion de données BCD en float

Conversion de données BCD en float - C++ - Programmation

Marsh Posté le 27-02-2008 à 15:10:59    

Bonjour,
 
Je lisun fichier dans lequel des données sont codées en BCD et je dois les décoder.
Quelqu'un pourrait-il me filer un tuyau pour décoder (notamment) des flottants codés sur 3 octets dans le fichier ?
 
Merci d'avance

Reply

Marsh Posté le 27-02-2008 à 15:10:59   

Reply

Marsh Posté le 28-02-2008 à 10:10:11    

bah tu lis 3 char, ça te donne 6 chiffres décimaux, ensuite tu les combines comme il faut.

Reply

Marsh Posté le 23-01-2009 à 13:41:33    

Bonjour tout le monde,
 
Je me permet de remonter le sujet mais malgré Google, je n'ai rien trouvé qui pourrait m'aider ...
Pour un projet de fin d'année, je reçois un tableau d'int en provenance d'un CAN, dans ma doc, on me dit que les données du tableau sont codées en BCD, mon prof n'est pas beaucoup plus a l'aise que moi là dessus et je ne sais pas trop comment m'y prendre, on me dit que les entiers forment une trame codée sur 8 octets et que chaque int (codé en BCD) contiennent en fait 2 chiffres en entiers naturels, ainsi dans ce tableau, je dois extraire finalement 16 caractères.
 
Si quelqu'un avait un début de piste là dessus :)
 
Merci d'avance

Reply

Marsh Posté le 23-01-2009 à 13:51:28    

Oui, il y a deux chiffres par octet.
Parfois il y a un demi-octet supplémentaire au début ou à la fin pour le signe.
Peut-être qu'il y a une virgule, mais souvent elle est implicite.
 
La conversion est assez facile à faire.


Message édité par olivthill le 23-01-2009 à 13:52:43
Reply

Marsh Posté le 23-01-2009 à 13:57:04    

Merci pour la réponse mais ça ne m'éclaire pas tant que ça...
Au risque de dire une énormité, je dois aller lire les deux premiers octets et me décaler ensuite deux octets et lire les nouveau ?
 
Un quote de mon énoncé pour être sur que j'ai bien tout retranscris...

Citation :

Les informations NMEA sont extraites octet par octet de la trame NMEA. Les chiffres en ASCII sont convertis en valeur décimales est regroupés par deux sur un octet pour optimiser la trame de données qui ne peut dépasser 8 octets


Message édité par amaurysme le 23-01-2009 à 13:58:05
Reply

Marsh Posté le 23-01-2009 à 14:19:15    

Affiche tes octets en hexadecimal et tu devrais comprendre la nature du BCD.

Reply

Marsh Posté le 23-01-2009 à 14:41:23    

Citation :

Affiche tes octets en hexadecimal et tu devrais comprendre la nature du BCD.


C'est que la, je n'ai pas ces trames...
Je ne galère pas tant que ça normalement, mais j'avoue que je n'arrive pas trop a trouver d'aide là-dessus  :(

Reply

Marsh Posté le 23-01-2009 à 15:06:54    

Le nombre vingt-cinq est stocke en BCD comme le nombre trente-sept (0x25).

Reply

Marsh Posté le 23-01-2009 à 20:14:55    

Une après-midi plus tard, je n'y arrive toujours pas :)
Faut avouer que je n'ai jamais fait de manipulation d'octets en C ou C++ et je ne comprends pas trop...
 

Citation :

Le nombre vingt-cinq est stocke en BCD comme le nombre trente-sept (0x25)


Je ne sais pas comment retrouver 25 à partir de 37, ce n'est pas faute d'avoir essayé :(

Message cité 1 fois
Message édité par amaurysme le 23-01-2009 à 20:15:14
Reply

Marsh Posté le 23-01-2009 à 20:33:15    

Non testé:

Code :
  1. unsigned long fromBCD1(unsigned long n)
  2. {
  3.     unsigned long result = 0;
  4.     while (n != 0) {
  5.         result = result * 10 + n & 0xF;
  6.         n >>= 4;
  7.     }
  8.     return result;
  9. }
  10. unsigned long fromBCD2(unsigned long n)
  11. {
  12.     unsigned long result = 0;
  13.     while (n != 0) {
  14.         result = result * 10 + n % 16;
  15.         n /= 16;
  16.     }
  17.     return result;
  18. }
  19. unsigned long toBCD(unsigned long n)
  20. {
  21.     unsigned long result = 0;
  22.     while (n != 0) {
  23.         unsigned long tmp = result;
  24.         result = result * 16 + n % 10;
  25.         if (tmp < result) {
  26.             throw "range error when converting to BCD";
  27.         }
  28.         n /= 10;
  29.     }
  30.     return result;
  31. }


Reply

Marsh Posté le 23-01-2009 à 20:33:15   

Reply

Marsh Posté le 23-01-2009 à 21:14:39    

amaurysme a écrit :

Une après-midi plus tard, je n'y arrive toujours pas :)
Faut avouer que je n'ai jamais fait de manipulation d'octets en C ou C++ et je ne comprends pas trop...
 

Citation :

Le nombre vingt-cinq est stocke en BCD comme le nombre trente-sept (0x25)


Je ne sais pas comment retrouver 25 à partir de 37, ce n'est pas faute d'avoir essayé :(


 
si tu sais pas passer de l'hexa au decimal, on peut rien pour toi aussi ...
 
0X25 = 2*16+5 = 37

Reply

Marsh Posté le 24-01-2009 à 09:48:06    


 
Ca m'apprendra a envoyer du code non testé écrit avec ma fille sur les genoux.  
Il y a au moins deux problèmes dans ce code:
   - ordre des chiffres inversé!
   - mauvais test de dépassement de capacité
(et naturellement il ne vérifie pas que c'est bien du BCD, mais ça c'était volontaire).

Reply

Sujets relatifs:

Leave a Replay

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