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++Builder Discussion :

[débutant] conversion int en hexa


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 106
    Points : 50
    Points
    50
    Par défaut [débutant] conversion int en hexa
    bonjour à tous,

    je dois convertir un nombre entier en 4 octets hexadecimaux.

    quand j'utilise la methode IntToHex(valeur), celle ci me renvoie un string.
    mon problème est que je souhaiterai obtenir un tableau de 4 char codé en hexa.

    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int valeur = 6328900;
    String resultat;
    resultat = IntToHex(valeur,4); //resultats = 609244
    or moi je souhaiterai avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char resultat[4];
    resultat = IntToHex(valeur,4); 
    //resultat[0] = x00;
    //resultat[1] = x60;
    //resultat[2] = x92;
    //resultat[3] = x44;
    merci pour vos réponses.


    [Modération, Alacazam : Prière d'utiliser la balise [CODE] qui améliore nettement la lisibilité, merci]

  2. #2
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    On peut envisager ce qui suit mais il y a peut-être mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int valeur = 6328900;
    AnsiString A=IntToHex(valeur,8);
    char Resultat[4];
    for(int i=0;i<A.Length()/2;i++) Resultat[i]=(A[i*2+1]-48)*16+A[i*2+2]-48;
    Il faut soustraire 48 à A[i] car A[i] est un code ascii de nombre, comme 48 est le code ascii de 0, on obtient véritablement 0 pour 0 ascii, 1 pour 1 ascii etc.

    À bientôt
    Gilles

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 106
    Points : 50
    Points
    50
    Par défaut
    Merci de ton aide Gilles, mais il y a un petit problème car le code hexa va jusqu'a FF. Or la valeur ascii du 'A' est 65 donc 65-48=17 et non 10.
    Je vais tester la valeur de chaque caractère et si elle est supérieure ou égale à 65 je vais soustraire 55 au lieu de 48.Sauf si tu as une nouvelle idée.

    Merci encore.

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2002
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 16
    Points : 22
    Points
    22
    Par défaut
    La solution est beaucoup plus simple : un entier est déjà codé en hexa en mémoire. Il suffit donc de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int valeur = 6328900;
    char Resultat[4];
    memcpy(Resultat, &valeur, 4);
    Il y a trois sortes d'informaticiens : ceux qui savent compter et ceux qui ne savent pas compter.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 106
    Points : 50
    Points
    50
    Par défaut

    trop fort drobert...

    merci

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 61
    Points : 55
    Points
    55
    Par défaut
    et sans le memcpy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    union int_ou_chaine
    {
       int decimal;
       char chaine[4];
    } nb;
     
    nb.decimal = 1145258561;
    on a bien nb.chaine[0] = 'A', nb.chaine[1] = 'B, nb.chaine[2] = 'C' et nb.chaine[3] = 'D'

  7. #7
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Merci de votre solution très élégante avec memcpy mais il était demandé ceci dans l'énoncé :

    Citation Envoyé par sergoid
    //resultat[0] = x00;
    //resultat[1] = x60;
    //resultat[2] = x92;
    //resultat[3] = x44;
    Votre solution donne les valeurs en sens inverse mais peut-être que cela peut quand même convenir au demandeur, c'est à lui de voir. Je ne crois pas qu'il existe de fonction de recopie dans le sens inverse, il faudrait donc le programmer nous-mêmes par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *ptr=(char*) & valeur;
    for(int i=0;i<4;i++) Resultat[3-i]=*ptr++;
    Sinon effectivement, j'ai oublié les lettres hexa (pas assez réveillé peut-être), il faut donc soustraire 48 pour les chiffres et 55 pour les lettres. Donc je corrige juste pour le fun. Je crée un petite fonction d'extraction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char TForm1::Extrac(char c)
    {
    if(c>57) return c-55; else return c-48;
    }
    Dans ces conditions, la boucle de calcul devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i=0;i<A.Length()/2;i++) Resultat[i]=Extrac(A[i*2+1])*16+Extrac(A[i*2+2]);
    Encore une fois, c'est juste pour le fun, des solutions immédiates ont été données. Comme j'ai fait beaucoup d'assembleur par le passé, je suis habitué à chercher moi-même les solutions. Mais en C++, il y a toute une collection de fonctions toutes prêtes.

    À bientôt
    Gilles

Discussions similaires

  1. Conversion chaine en hexa, return int.
    Par Oseam dans le forum C
    Réponses: 13
    Dernier message: 19/02/2013, 12h58
  2. conversion base string hexa-> int
    Par koda29 dans le forum C
    Réponses: 7
    Dernier message: 14/05/2010, 17h07
  3. [Débutant] Conversion d'un String en Int
    Par chleuh dans le forum Langage
    Réponses: 9
    Dernier message: 30/12/2004, 13h33
  4. conversion : (Ascii en hexa) => nombre
    Par tut dans le forum C++
    Réponses: 3
    Dernier message: 21/04/2004, 14h44
  5. [langage] conversion décimal vers hexa
    Par chipster dans le forum Langage
    Réponses: 2
    Dernier message: 23/02/2004, 16h05

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