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 chevronn� Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    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.

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 chevronn� Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Par d�faut
    je me trompe, c'est:
    7E14AE47E17A943F

  4. #4
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 chevronn� Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    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.

  6. #6
    Mod�rateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur d'emploi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    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 confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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?

  8. #8
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 chevronn� Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    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.

  10. #10
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur d'emploi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    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 chevronn� Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    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.

+ 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