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

  FORUM HardWare.fr
  Programmation
  C++

  Conversion de données BCD en float

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Conversion de données BCD en float

n°1693647
G1776
Posté le 27-02-2008 à 15:10:59  profilanswer
 

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

mood
Publicité
Posté le 27-02-2008 à 15:10:59  profilanswer
 

n°1694087
Taz
bisounours-codeur
Posté le 28-02-2008 à 10:10:11  profilanswer
 

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

n°1841998
amaurysme
Posté le 23-01-2009 à 13:41:33  profilanswer
 

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

n°1842002
olivthill
Posté le 23-01-2009 à 13:51:28  profilanswer
 

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
n°1842006
amaurysme
Posté le 23-01-2009 à 13:57:04  profilanswer
 

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
n°1842010
Un Program​meur
Posté le 23-01-2009 à 14:19:15  profilanswer
 

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

n°1842023
amaurysme
Posté le 23-01-2009 à 14:41:23  profilanswer
 

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  :(

n°1842050
Un Program​meur
Posté le 23-01-2009 à 15:06:54  profilanswer
 

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

n°1842307
amaurysme
Posté le 23-01-2009 à 20:14:55  profilanswer
 

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
n°1842315
Un Program​meur
Posté le 23-01-2009 à 20:33:15  profilanswer
 

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


mood
Publicité
Posté le 23-01-2009 à 20:33:15  profilanswer
 

n°1842320
Joel F
Real men use unique_ptr
Posté le 23-01-2009 à 21:14:39  profilanswer
 

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

n°1842397
Un Program​meur
Posté le 24-01-2009 à 09:48:06  profilanswer
 


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


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

  Conversion de données BCD en float

 

Sujets relatifs
Authentification HTTP au moyen d'une base de donnéesIntégrer un flux de données vers SQL
conversion de __u8 en intSélectionner une colonne de données à partir d'un fichier TXT
[mySQL] structure de la base de données pour sondage multiplesBase de données dates groupées par mois sur Access
Importer table externe avec sequence dans une base de donnéesGestion de base de données
[C#] Convertir un Float en StringConversion c en c++
Plus de sujets relatifs à : Conversion de données BCD en float


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR