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 :

forcer une valeur hexa a etre en decimal en memoire


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut forcer une valeur hexa a etre en decimal en memoire
    Bonjour,

    Voici une variable qui contient une donnée avec chaque element compris entre 0 et 9.
    ex: var = 1981

    Maintenant, j'aimerais que "var2" soit égale en hexadécimal à la valeur décimal de var.
    ex: var2 = 0x1981

    Je vois bien une solution qui consisterais à convertir "var" d'hexa (0x7BD) en valeur décimale (1981), puis d'assigner à "var2" en hexadécimal cette variable.
    N'y aurait t-il pas quelquechose de plus simple avec des %d, %S ??

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    que pensez vous de:
    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
    int DORI_convert_hex (int nombre )
    {
    	int dec;
    	int M,C,D,U;
    	M = (nombre/1000) && 0x000F ;	
    	C = ( (nombre/100) - 10*M ) && 0x000F ;	
    	D = ( (nombre/10) - 100*M - 10*C) && 0x000F ;	
    	U = ( (nombre - 1000*M - 100*C -10*D) && 0x000F ;
    	dec = 0xFFFF;
    	dec = dec && U;
    	dec = dec && (D<<4);
    	dec = dec && (C<<8);
    	dec = dec && (M<<12);
    	return dec;	
    }
    ??

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Je ne suis pas assez en forme pour corriger cela. Par contre, je pense que tu as plus intéret à utiliser des | que des &&...

    En attendant, la "solution simple avec des %d" :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    long conversion_1234_en_0x1234(int nb)
    {
    	char buf[20];
    	sprintf(buf, "%d", nb);
    	return strtol(buf, NULL, 16);
    }
    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.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Si je passe 1234 à la fonction, elle me retourne 4660.
    Si je lui passe 1981, elle me retourne 6529, qui correspond bien à 0x1981.
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    Merci pour ta reponse,
    Je teste ton code

    Peux tu me dire ce qui ne va pas dans ce que j'avais fait (histoire que je progresse), merci

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Ben déjà, tu utilises && au lieu de & (le ET booléen au lieu du ET bit-à-bit).
    Et ensuite, dans la seconde partie c'est un OU qu'il faudrait utiliser à la place.

    Code C : 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
    int conversion_1234_en_0x1234(int nombre)
    {
    	int nombre0x;
    	int m, c, d, u;
    	/* Refuse les nombres de plus de quatre chiffres */
    	if(nombre >= 10000)
    		return -1;
     
    	/* Récupère les quatre chiffres */
    	m = (nombre      )/1000;
    	c = (nombre%1000)/100;
    	d = (nombre%100)/10;
    	u = (nombre%10);
     
    	/* Les utilise en hexa */
    	nombre0x = (m<<12) | (c<<8) | (d<<4) | (u);
    	return nombre0x;
    }
    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.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    Merci

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gronaze Voir le message
    Voici une variable qui contient une donnée avec chaque element compris entre 0 et 9.
    ex: var = 1981
    Ben non. Cette variable est ici exprimée en décimal, mais elle est en réalité codée avec une combinaison de 0 et de 1 dans une variable de type int (je suppose,) soit :

    0x07BD, ce qui se traduit immédiatement en binaire par : 0000 0111 1011 1101 (le considère que l'int fait 16-bit, ce qui est le minimum exigé par le C).
    .
    Maintenant, j'aimerais que "var2" soit égale en hexadécimal à la valeur décimal de var.
    ex: var2 = 0x1981

    Je vois bien une solution qui consisterais à convertir "var" d'hexa (0x7BD) en valeur décimale (1981), puis d'assigner à "var2" en hexadécimal cette variable.
    N'y aurait t-il pas quelquechose de plus simple avec des %d, %S ??
    Tu confonds allègrement les valeurs internes et leur représentation, mais c'est pas grave...

    En gros, tu veux interpréter la chaine "1981" comme une valeur héxa, c'est ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       unsigned long x = strtoul("1981", NULL, 16);
    tout simplement. Lire la doc de strtol()...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main (void)
    {
       unsigned long x = strtoul ("1981", NULL, 16);
     
       printf ("x = 0x%lX (%lu)\n", x, x);
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    x = 0x1981 (6529)
     
    Press ENTER to continue.

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

Discussions similaires

  1. [Formulaire]forcer une valeur par défaut
    Par Dore dans le forum IHM
    Réponses: 2
    Dernier message: 03/04/2007, 13h35
  2. [DTD]Forcer une valeur d'une balise
    Par mamiberkof dans le forum Valider
    Réponses: 1
    Dernier message: 22/01/2007, 22h26
  3. Forcer une valeur alpha en numérique
    Par lodan dans le forum Langage
    Réponses: 2
    Dernier message: 14/11/2006, 17h29
  4. Remplacement d'une valeur hexa dans une chaine
    Par raoulchatigre dans le forum C++
    Réponses: 7
    Dernier message: 18/09/2006, 16h27
  5. Réponses: 8
    Dernier message: 11/08/2005, 09h32

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