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 :

Conversion chaine en hexa, return int.


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    étudiant @ Epitech
    Inscrit en
    Novembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : étudiant @ Epitech
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 16
    Points : 9
    Points
    9
    Par défaut Conversion chaine en hexa, return int.
    Bonjour,

    je dois réaliser une fonction me permettant de convertir une chaine de caractères en hexa en retournant un unsigned int, afin de le convertir de la forme 0x 00ea 2733 ....

    Je pensais convertir caractère par caractère car on peut aller jusqu'à 2048 bits à convertir... Sauf que je suis un peu perdu sur quoi partir.

    Ps : je n'ai pas le droit à tout ce qui est scanf et fonction système non recodée par moi même.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 410
    Points : 23 809
    Points
    23 809
    Par défaut
    Bonjour,

    Si c'est en hexa, tu peux la traiter caractère par caractère. C'est très facile.

    Il te suffit d'utiliser une variable unsigned int initialisée à zéro et te servant d'accumulateur. Tu lis ensuite la chaîne de gauche à droite et à chaque tour, tu multiplies l'accumulateur par seize et tu lui ajoutes la valeur représentée par le caractère courant.

    Quand tu as atteint la fin de la chaîne, tu sors en renvoyant le résultat.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    étudiant @ Epitech
    Inscrit en
    Novembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : étudiant @ Epitech
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup pour l'aide ! Je vais essayé ça

  4. #4
    Futur Membre du Club
    Homme Profil pro
    étudiant @ Epitech
    Inscrit en
    Novembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : étudiant @ Epitech
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Heu, j'ai un petit souci avec le terme accumulateur, à par une pile, ça me dit pas grand chose, tu peux développer s'il te plait ?

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 410
    Points : 23 809
    Points
    23 809
    Par défaut
    Un « accumulateur » est un registre qui sert à la fois d'opérande à une opération et à en recevoir le résultat. L'avantage est que cela te permet également de le réutiliser immédiatement dans l'opération suivante, ce qui est intéressant lorsque tu fais des itérations. En ce sens, l'écran d'une calculatrice quatre opérations peut être considéré comme un accumulateur.

    À noter qu'un « registre » est n'importe quoi qui puisse contenir une valeur. Beaucoup de gens associent implicitement le mot « registre » à « registre du processeur », mais ce n'en est en fait qu'un cas particulier, et l'expression « registre du processeur » est vraie en soi mais n'est qu'une appellation généraliste pour désigner quelque chose qui ne portait pas de nom dédié. Mais on le retrouve partout ailleurs en informatique, à commencer par la « base de registres » Windows, ainsi que dans la vie courante, comme le « registre d'un hôtel ». D'ailleurs, dans cet esprit, la fameuse base de registre est parfois traduite en « le registre système ».

    Mais pour l'heure, tu n'as pas besoin de t'embrouiller avec tout cela : tu n'as qu'à considérer qu'il s'agit d'une variable « total » que tu initialises à zéro au départ et que tu vas remplir tout au long de ta boucle.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    étudiant @ Epitech
    Inscrit en
    Novembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : étudiant @ Epitech
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Génial ! Merci pour la réponse et le temps pris pour celle-ci !

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 410
    Points : 23 809
    Points
    23 809
    Par défaut
    À ton service mais n'oublie pas !
    Bon courage.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    étudiant @ Epitech
    Inscrit en
    Novembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : étudiant @ Epitech
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Sauf que le problème n'est pas encore résolu !

    Je travaille sur ce que tu m'as dit, mais j'ai un peu de mal là.

    Si on a "Multipass" d'écrit, on obtient : 038d 4d75 6c74 6970 6173 73

    je n'arrive pas à obtenir quelque chose de semblable.

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 410
    Points : 23 809
    Points
    23 809
    Par défaut
    Citation Envoyé par Oseam Voir le message
    Si on a "Multipass" d'écrit, on obtient : 038d 4d75 6c74 6970 6173 73
    je n'arrive pas à obtenir quelque chose de semblable.
    Ça, ca n'a rien à voir ! « 038d » est indéfini (parasite ou composante du projet non spécifiée ici) et « 4d 75 6c 74 69 70 61 73 73 » sont les codes ASCII de « Multipass ».

    Si c'est vraiment l'objectif à atteindre, ça veut dire, d'une part, que la chaîne en question est déjà enregistrée en mémoire de cette façon et qu'il n'y a rien à faire, et que tu ne pourrais contenir que quatre caractères en 32 bits et huit en 64 bits.

    Dis-nous exactement quel est l'objectif de ton devoir.

  10. #10
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Tu n'as pas dû bien expliquer ton problème, car "Multipass" n'est pas une chaîne représentative d'un nombre en hexa.
    Si tu attends comme réponse 038d 4d75 6c74 6970 6173 73, il faut reformuler le problème.
    A noter que 4d75 6c74 6970 6173 73 correspond au code ASCII des caractères de "Multipass". Quant à 038d, je n'en sais rien.

    [grillé]

  11. #11
    Futur Membre du Club
    Homme Profil pro
    étudiant @ Epitech
    Inscrit en
    Novembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : étudiant @ Epitech
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Haha, en effet je n'ai pas bien expliqué, je ne pensais pas que cela serait "problématique".

    Alors en fait, je bosse sur un assembleur, et j'essaie de convertir des chaînes de caractères afin de communiquer avec une machine virtuelle. Les "00 après le 73" sont là pour compléter les 2048 octets.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    étudiant @ Epitech
    Inscrit en
    Novembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : étudiant @ Epitech
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Voilà ce que j'ai fais pour l'instant :

    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
    #include <stdio.h>
     
    int     convert_hexa(char *str)
    {
      unsigned int  ret;
       int           i;
     
      ret = 0;
      i = 0;
      while (str[i])
        {
          ret = ret * 16;
          ret = ret + (str[i]);
          i++;
        }
      return (ret);
    }
     
    int     main(int ac, char **av)
    {
      printf("%x\n", convert_hexa(av[1]));
    }
    et je n'arrive pas à obtenir la conversion ascii en hexa de chaque lettre...

  13. #13
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    Si ton objectif est d'avoir la représentation hexadécimale de ta chaîne à travers le jeu de caractères que tu utilises, alors il va falloir faire attention aux débordements. Par exemple, la chaîne « Multipass » que tu donnes pour exemple tient sur 9 * CHAR_BIT bits (soit 72 bits la plupart du temps). Je ne suis pas certain que l'entier, soit, en conséquence, le bon moyen de stockage. Quand bien même tu voudrais effectuer ces opérations sur de petites chaînes, tu pourrais utiliser les opérateurs bit à bit pour ce faire. Par exemple, tu pourrais prendre la valeur ASCII de chacun de tes caractères, et les décaler de x bits vers la gauche, de manière à faire apparaître les différents chiffres du nombre final. L'opérateur binaire OU te permettra de positionner les bits en question. Exemple d'implémentation en C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stddef.h>
     
    int GetHexaString(const char *s, size_t n) {
      int res = 0, c;
      while (c = *s++) res |= c << (--n << 3);
      return res;
    }
    Si ton objectif est de communiquer avec un composant externe, alors tu devrais également faire attention à l'endianness.

    Bonne journée !

  14. #14
    Futur Membre du Club
    Homme Profil pro
    étudiant @ Epitech
    Inscrit en
    Novembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : étudiant @ Epitech
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Je te remercie pour ta réponse, on a effectivement du passer la machine en big endian !

    Je peux désormais classer le sujet en résolu.

    Merci !

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

Discussions similaires

  1. conversion chaine hexa en int
    Par Biosox dans le forum SL & STL
    Réponses: 2
    Dernier message: 31/05/2007, 12h17
  2. conversion chaine en hexa?
    Par Wael Maaoui dans le forum Général Python
    Réponses: 5
    Dernier message: 16/03/2007, 13h11
  3. [T-SQL]Conversion chaine de caracteres -> HEXA
    Par julio84 dans le forum Sybase
    Réponses: 1
    Dernier message: 21/09/2006, 09h28
  4. [SYBASE][T-SQL]Conversion chaine de caracteres -> HEXA
    Par julio84 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/09/2006, 17h28
  5. conversion d'une chaine de caractère en int
    Par greg13 dans le forum C++
    Réponses: 3
    Dernier message: 25/08/2005, 17h18

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