IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

convertir une chaine contenant un HEX en FLOAT (en C)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Par défaut convertir une chaine contenant un HEX en FLOAT (en C)
    bonjour,
    je veut convertir une chaine contenant un hex en FLOAT,
    j'ai essayer strtod(str,NULL) mais ça donne pas la valeur désirée
    Exemple :

    "0X21A3B50A"
    ça donne un nombre sans virgule
    le même résultat je l'obtient avec atoi
    merci

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    0X21A3B50A n'est pas l'expression valide d'un flottant, mais d'un entier. Il faut donc tout d'abord convertir la chaîne "0X21A3B50A" en entier avec strol, strtoul ou sscanf par exemple ensuite caster cet entier en flottant. En même temps je ne comprends pas l'intérêt de faire cette conversion, que cherches-tu à faire exactement ?

  3. #3
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Si "0X21A3B50A" est la représentation binaire de ton flottant en chaine de caractères, tu dois convertir cette chaine (représentation BCD) en décimal et pointer ton flottant sur le résultat en décimal.
    En gros : (non testé, attention au little endian et big endian)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char nbStr[] = "0X21A3B50A";
    char numChar[4];
    numChar[3] = (char)atoi(nbStr[1]); // nbStr[0] etant "0x" 
    numChar[2] = (char)atoi(nbStr[2]);
    numChar[1] = (char)atoi(nbStr[3]);
    numChar[0] = (char)atoi(nbStr[4]);
     
    float *res = (float *)numChar;
    C'est très moche , mais c'est pour montrer le principe. Il faut penser : réprésentation en mémoire du flottant.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Par défaut
    merci

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par fregolo52 Voir le message
    ...En gros : (non testé, attention au little endian et big endian)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char nbStr[] = "0X21A3B50A";
    char numChar[4];
    numChar[3] = (char)atoi(nbStr[1]); // nbStr[0] etant "0x" 
    numChar[2] = (char)atoi(nbStr[2]);
    numChar[1] = (char)atoi(nbStr[3]);
    numChar[0] = (char)atoi(nbStr[4]);
     
    float *res = (float *)numChar;
    C'est très moche , mais c'est pour montrer le principe. Il faut penser : réprésentation en mémoire du flottant.
    C'est faux, atoi() ne prend pas en argument un caractère mais une chaine de caractères.

    "0X21A3B50A"
    ça donne un nombre sans virgule
    C'est sensé représenter quelle valeur flottante ?

  6. #6
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par diogene
    C'est faux, atoi() ne prend pas en argument un caractère mais une chaine de caractères.
    Et même en remplaçant tous les nbStr[i] en nbStr[i] + i ça ne marche toujours pas. Pire, ça ne donne même pas le code BCD recherché, qui n'a déjà rien à voir avec la représentation des flottants en C.

    serialC : relis mon message plus haut. Tu as quelques exemples de conversion des chaînes ici si c'est ce dont tu as besoin.

  7. #7
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Citation Envoyé par diogene Voir le message
    C'est faux, atoi() ne prend pas en argument un caractère mais une chaine de caractères.
    Ok, mon code est faux, mais le principe peut-être bon.
    C'est plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char tmp[3];
    strncpy(tmp, nbStr[2], 2);
    tmp[2]= '\0';
    numChar[3] = (char)atoi(tmp);
    strncpy(tmp, nbStr[4], 2);
    ...
    Ne sachant pas comment "0X21A3B50A" a été stocké, on ne peut faire que des hypothèses.


    PS : j'ai aussi pensé au BCD.

  8. #8
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par fregolo52
    Ok, mon code est faux, mais le principe peut-être bon.
    Dans ce cas fallait mettre du pseudocode car quand tu postes un code C, il est censé marcher.

    Par ailleurs, ça ne marche toujours pas parce que atoi suppose que la chaîne passée en paramètre représente un entier écrit en base 10 et non en base 16.

    Et enfin, même si on remplaçait atoi par une fonction atoi16 qui ferait ce que tu veux faire, ton code ne donne toujours pas le bon résultat, et on est même encore loin de l'avoir. Ca serait bien aussi si tu testais un peu tes codes avant de les poster.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertir une chaine en float
    Par P.G dans le forum Débuter
    Réponses: 2
    Dernier message: 20/12/2013, 09h51
  2. [XSLT]Convertir une chaîne en float, int etc ... avec XSL
    Par wozzz dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 19/05/2006, 10h12
  3. [C#] Convertir une chaine accentue => sans accents
    Par alex57 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/09/2005, 09h21
  4. Convertir une chaine en format heure
    Par Lars dans le forum ASP
    Réponses: 3
    Dernier message: 24/05/2005, 11h44
  5. Convertir une chaine UTF8 en ISO-8859-1
    Par eods dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 26/08/2004, 16h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo