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 un hexadécimal string vers du double décimal.


Sujet :

C++

  1. #1
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut convertir un hexadécimal string vers du double décimal.
    Bonjour, je voudrais convertir un string en hexadécimal vers du décimal double précision.
    Voici le hex : 7E14AE47
    qui devrait donner : 0.02 en décimal.
    Je sais vraiment pas comment faire.
    amicalement, mess-mate ( debian/debian-like )
    Une petite recherche sur le forum...et hop
    LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
    Albert

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Euh, tu n'en as que pour 32 bits ici. C'est seulement de la simple précision...

    Dans tous les cas, tu convertis ça en unsigned int (ou unsigned long si tu n'es pas sur une architecture LP64), puis tu fais un memcpy() vers un float (ou tu joues avec les reinterpret_cast<> de pointeurs)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut
    je me trompe, c'est:
    7E14AE47E17A943F
    amicalement, mess-mate ( debian/debian-like )
    Une petite recherche sur le forum...et hop
    LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
    Albert

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Eh bien, comme j'ai dit. En C, je ferais un strtoull() (C99, ou deux strtol() sinon) pour obtenir un long long, puis je ferais un memcpy() vers un double.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut
    Eh non. Le strtoxxx n'est valable que pour du décimal, pas pour le hex.
    Je crois qu'il faut passer par hex->bin->dec.
    Là où tout ce complique c'est de le passer en 64bits.( du float).
    Khexedit le fait très bien, je vois bien le nombre décimal exact sur 64bits.
    Le problème c'est d'écrire un programme soi-même en c++ afin d'arriver à la même chose.
    amicalement, mess-mate ( debian/debian-like )
    Une petite recherche sur le forum...et hop
    LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
    Albert

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Pourquoi faire une recopie ? Autant tout mettre dans un tableau de unsigned chars, et caster le pointeur vers « double * ».

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    using namespace std;
    
    int main (void)
    {
        unsigned char nombre[] = { 0x7E, 0x14, 0xAE, 0x47,
                                   0xE1, 0x7A, 0x94, 0x3F };
    
        cout << *(double *)nombre << endl;
        return 0;
    }
    
    $ ./double
    0.02

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Pourquoi faire une recopie ? Autant tout mettre dans un tableau de unsigned chars, et caster le pointeur vers « double * ».
    Et comment tu t'assures que ton tableau de char est correctement aligne pour un double?
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par mess-mate Voir le message
    Eh non. Le strtoxxx n'est valable que pour du décimal, pas pour le hex.
    Moult te goures. strtoull() permet de spécifier la base.
    Seule strtod() est restreinte au décimal.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut
    La méthode Obsidan marche mais n'est pas applicable sinon il faut transformer le string 7E14AE47E17A943F et encore si c'est possible.

    En effet le hex est lu d'un fichier en raw dans un string:
    par ex: dansLeString : 7E14AE47E17A943F

    J'ai essayé également le strtoul et aucun résultat valable même en le multipliant par 2. ( Le strtoull existe ?? J'ai pas trouvé. )

    Pour l'instant j'ai trouvé aucune solution pour une conversion vers un double, même en passant par Hex->Bin->Double.
    Il y a un tas de conversions sur le net mais rien pour du double.
    amicalement, mess-mate ( debian/debian-like )
    Une petite recherche sur le forum...et hop
    LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
    Albert

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    strtoull() est, si je ne m'abuse, une fonction C99.
    Pour pouvoir faire deux strtol(), je pense que tu vas devoir partager ta chaîne en deux.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Ou alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <iostream>
     
    using namespace std;
     
    int main (void)
    {
        char            c;
        int             x;
        unsigned char   nombre[sizeof(double)];
        string          s("7E14AE47E17A943F");
     
        for (x=0;x<(sizeof(double)*2);++x)
        {
            c = s[x];
     
            if      (c>='0' && c<='9')  c -=  '0'      ;
            else if (c>='A' && c<='F')  c -= ('A' - 10);
            else if (c>='a' && c<='f')  c -= ('a' - 10);
            else break;
     
            if (x & 1)  nombre [x >> 1] += (unsigned char)c;
            else        nombre [x >> 1]  = (unsigned char)c << 4;
        }
     
        cout << *(double *)nombre << endl;
     
        return 0;
    }

  12. #12
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut
    Waw.. mais c'est la simplicité même...
    C'est en fait tout ce qu'il me fallait.

    J'ai vraiment cherché la complexité quoique le plus simple est le plus difficile.

    Merci Obsidan pour ce code et également merci à tous que j'avais peut-être mis sur une mauvaise piste.

    Il faut maintenant que je le mette en oeuvre pour transformer mon fichier data en binaire vers un fichier texte data ainsi que la transformation des short, int,long et unsigned.

    PS: la prochaine étape est la transformation d'un binaire double vers le décimal.
    amicalement, mess-mate ( debian/debian-like )
    Une petite recherche sur le forum...et hop
    LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
    Albert

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

Discussions similaires

  1. convertir un type string vers un type double
    Par hegros dans le forum C#
    Réponses: 2
    Dernier message: 16/06/2010, 09h11
  2. convertir du type string au type double
    Par nafroutabs dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 15/09/2008, 10h27
  3. Réponses: 8
    Dernier message: 20/06/2008, 14h47
  4. Convertir d'hexadécimal vers décimal
    Par WebPac dans le forum Delphi
    Réponses: 4
    Dernier message: 05/09/2006, 12h01
  5. String vers un Double
    Par hugoferd dans le forum Langage
    Réponses: 1
    Dernier message: 16/10/2005, 20h46

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