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 :

hexadécimaux dans tableau de char


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 7
    Par défaut hexadécimaux dans tableau de char
    Bonjour à tous,

    Actuellement, j'essaie de résoudre le problème suivant, mais en vain :

    Soit un hexadécimal X = 0x35AB.
    char t[2] = {0x35, 0xAB}

    J'ai une fonction f telle que :

    f(t, taille = 2) -> return char tab_ret [4] = {0x33, 0x35, 0x41, 0x42}, i.e. qui pour chaque code ascii de X, retourne sa valeur héxa : '3' -> 0x33, '5' -> 0x35, 'A' -> 0x41, 'B' -> 0x42.

    Pour tester ma fonction, je déclare uchar1 = 53 (pour 0x35) et uchar2 = 171 (0xAB), puis un char t_test[2], que je le remplis avec uchar1 et uchar2.
    Pour l'instant, ça marche.

    Ce que je souhaiterais faire, et que je n'arrive pas, c'est la fonction inverse, qui prend en paramètre char t_inv[4] = {0x33, 0x35, 0x41, 0x42}, et me return char t_ret [2] = {0x35, 0xAB}.

    Merci d'avance pour votre aide, et si je n'ai pas été assez clair n'hésitez pas à me rependre.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 450
    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 450
    Par défaut
    Bonjour,

    En premier lieu, si tu es sûr que ton format de sortie sera toujours le même (16 bits), tu peux utiliser un unsigned short int voire même simplement un unsigned int plutôt qu'un tableau.

    Ensuite, pour convertir un nombre hexadécimal écrit en toutes lettres vers une valeur numérique binaire, il faut prendre chaque chiffre, un par un en partant de la gauche, déterminer sa valeur individuelle, décaler vers la gauche la valeur déjà présente dans ton accumulateur, et y ajouter celle que tu viens de déterminer.

    Pour décaler d'un chiffre vers la gauche une valeur en hexadécimal, on la multiplie par 16, exactement de la même façon que l'on multiplie par 10 une valeur décimale pour obtenir le même résultat.

    Ce qui donne quelque chose ressemblant à ceci :

    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
    #include <stdio.h>
     
    int main (void)
    {
        int i = 0;
        unsigned int total = 0;
        char t_inv[4] = {0x33, 0x35, 0x41, 0x42};
     
        for (i=0;i<sizeof t_inv;i++)
        {
            total *= 16;
     
            if      (t_inv[i] >= '0' && t_inv[i] <= '9') total += t_inv[i] - '0';
            else if (t_inv[i] >= 'A' && t_inv[i] <= 'F') total += t_inv[i] - 'A' + 10;
            else if (t_inv[i] >= 'a' && t_inv[i] <= 'f') total += t_inv[i] - 'a' + 10;
            else break;
        }
     
        printf ("%02x\n",total);
        return 0;
    }

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Bonsoir,

    Étant donné que, dans ton projet, tu sembles prendre pour acquis que l'utilisateur utilise le jeu de caractère ASCII, on va faire comme si c'était le cas, ie. je présumerai, dans la suite de ma réponse, que 'A'-'B'=1 par exemple, mais on notera que ce n'est pas une relation qui est portable, et qui serait donc à éviter si jamais les consignes qui te sont imposées n'en font pas la remarque (de même pour le nombre de bits dans un byte, qu'on présupposera à 8). Très simplement, tu pourrais récupérer, dans un premier temps, la valeur du caractère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <string.h>
     
    const char *alphabet="0123456789ABCDEF";
    const char *position=strchr(alphabet, hexa);
     
    if (position != NULL)
    {
      ptrdiff_t offset=position-alphabet;
      /* ... */
    }
    Par conséquent, offset va donner la valeur du byte courant. Le reste n'est plus qu'une question de décalages de bits. On pourrait imaginer le code suivant :

    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
    /* Version portable. */
     
    #include <stdlib.h>
    #include <string.h>
     
    unsigned char *not_f(const unsigned char *src,
                         const size_t length)
    {
      const char *const alphabet = "0123456789ABCDEF";
      unsigned char *dst;
      size_t i;
     
      dst = malloc(length >> 1);
     
      for(i = 0; i < length; i += 2)
      {
        const char *const position[2] =
        {
          strchr(alphabet, src[i]), 
          strchr(alphabet, src[i + 1])
        };
     
        dst[i >> 1] = (unsigned char)((position[0] - alphabet) << 4) | (position[1] - alphabet);
      }
     
      return dst;
    }
    Par contre, il faudra évidemment placer des assertions un peu partout (taille multiple de 2, allocations et recherches qui causent un comportement indéterminé, etc.). Donc, la gestion des erreurs est entièrement à faire.

    Bonne soirée !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 7
    Par défaut
    Merci à vos deux réponses, dont les explications d' Obsidian, et le code de Kirilenko qui fonctionne et me retourne bien les valeurs attendues.

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

Discussions similaires

  1. des strings dans tableau(sans char!)
    Par senvedgi dans le forum Débuter
    Réponses: 3
    Dernier message: 29/09/2011, 17h06
  2. Intégrer une vaiable float dans un tableau de char
    Par NoritakaRomain dans le forum C
    Réponses: 2
    Dernier message: 14/05/2007, 15h19
  3. Copier un long dans un tableau de char?
    Par the_ionic dans le forum C
    Réponses: 15
    Dernier message: 29/06/2006, 09h31
  4. retrouver unesuite de caractères dans un tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 17
    Dernier message: 12/07/2005, 23h43
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

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