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 une chaine Type Hexa en Dec


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2006
    Messages : 45
    Points : 28
    Points
    28
    Par défaut Convertir une chaine Type Hexa en Dec
    Bonjour à tous

    Je reçois, sur mon serveur, une trame de caractères de taille variable émit de mon client. (min 16caractères)
    Cette Trame est stocker dans un buffer de Type char. (EX: 0010578F875A1604)
    Le contenu de cette Trame est de l'Hexa. (En orange: Taille, en Vert: Protocole, en Violet: les données)

    Mon problème est le suivant: Je n'arrive pas à convertir les 2 premiers bytes de cette trames 0010 (Qui correspond à la Taille total de la Trame) en décimal. (En gros, 0010 devrait me retourner 16 )

    Pouvez-vous m'y aider ?
    Je vous remercie.

    NB: Programmation C / Ubuntu / Client <-> Server via Socket de base.

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    de mémoire ce n'est pas possible de le traduire de suite il faut que tu fasse un algo qui le fasse. En gros la question c'est comment fait on pour passer de l'hexadécimal au décimal en suite tu code l'algo.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2006
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par snowpy Voir le message
    de mémoire ce n'est pas possible de le traduire de suite il faut que tu fasse un algo qui le fasse. En gros la question c'est comment fait on pour passer de l'hexadécimal au décimal en suite tu code l'algo.
    C'est bien ce qu'il me semblait
    Le problème, c'est que ma Trame est stocké directement dans un Buffer en Char. Ce qui donne, une fois découpée:
    char Taille_trame[5] = 0010;
    char Proto[3] = 57;
    char *data = 8F875A1604;

    En gros ce qu'il me manque c'est l'algo qui boucle caractere par caractere dans la variable Taille_trame" et qui dis que:
    si le caractère lu = a un tableau d'hexa défini(=valeur, Enum ?), alors on stock cette valeur et on l'additionne aux autres.

    Total Dec = (Val1 convertie)*16^0 + (Val2 convertie)*16^1 + (Val3 convertie)*16^2 + (Val4 convertie)*16^3

    C'est bien ça ?

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Citation Envoyé par Nissartis Voir le message
    En gros ce qu'il me manque c'est l'algo qui boucle caractere par caractere dans la variable Taille_trame" et qui dis que:
    si le caractère lu = a un tableau d'hexa défini(=valeur, Enum ?), alors on stock cette valeur et on l'additionne aux autres.

    Total Dec = (Val1 convertie)*16^0 + (Val2 convertie)*16^1 + (Val3 convertie)*16^2 + (Val4 convertie)*16^3

    C'est bien ça ?
    Oui, mais chaque fois que l'on convertit une base dans une autre, on utilise un accumulateur. En gros, tu prends une variable x, tu l'initialises à zéro, et tu entres dans ta boucle en lisant ton nombre de gauche à droite.

    À chaque tour de boucle, tu identifies la valeur du caractère lu, tu multiplies x par 16 et tu lui ajoutes la valeur que tu viens d'identifier.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2006
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Oui, mais chaque fois que l'on convertit une base dans une autre, on utilise un accumulateur. En gros, tu prends une variable x, tu l'initialises à zéro, et tu entres dans ta boucle en lisant ton nombre de gauche à droite.

    À chaque tour de boucle, tu identifies la valeur du caractère lu, tu multiplies x par 16 et tu lui ajoutes la valeur que tu viens d'identifier.
    En suivant tes conseilles :
    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
    29
    30
    31
    32
     
    int i_char_hexa_dec(char tableau_Val[])
    {
     int i_taille_tableau;
     int i_cpt_for;
     int i_cpt_puissance = 0;
     int i_total = 0;
     int i_atoi_val = 0;
     char c_val_select;
     i_taille_tableau = sizeof(tableau_Val);
     i_cpt_for = (i_taille_tableau - 1);
     
    for(i_cpt_for;(i_cpt_for+1) != 0;i_cpt_for--)
      {
       i_atoi_val = (int)tableau_Val[i_cpt_for];
       if(i_atoi_val >= 48 && i_atoi_val <= 57)
        {
         i_total = i_total + ((i_atoi_val - 48)*(pow(16,i_cpt_puissance)));
         i_cpt_puissance = i_cpt_puissance + 1;
        }
       else if(i_atoi_val >= 65 && i_atoi_val <= 70)
        {
         i_total = i_total + (((i_atoi_val - 65)+10)*(pow(16,i_cpt_puissance)));
         i_cpt_puissance = i_cpt_puissance + 1;
        }
       else
        {
     
        }
      }
     return i_total;
    }
    Merci de me corriger ou de critiquer mon code si y'a plus simple

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Oublie pow() et la lib mathématique d'une manière générale. :-) C'est un problème purement arithmétique.

    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
    19
    int hex2dec (char * tab)
    {
        int           x = 0;
        unsigned char c = 0;
     
        while (*tab != '\0') 
        {
            if      (*tab >= '0' && *tab <= '9') c = *tab - '0';
            else if (*tab >= 'a' && *tab <= 'f') c = *tab - 'a' + 10;
            else if (*tab >= 'A' && *tab <= 'F') c = *tab - 'A' + 10;
            else break;
     
            x = x * 16 + c;
     
            tab++;
        }
     
        return x;
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Hello,

    Si je ne dis pas de bêtises, on peut éviter de réinventer la roue comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int hex2dec (const char * tab) {
        int res;
        sscanf(tab, "%X", &res);
        return res;
    }
    Dans ton cas, il faut juste isoler les deux premiers octets dans une chaîne de char avec \0 terminal

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2006
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Merci pour vos réponses
    Je passe en Résolu

    Bonne journée

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

Discussions similaires

  1. Convertir une chaine en hexa
    Par Rawend dans le forum C
    Réponses: 8
    Dernier message: 14/05/2014, 17h39
  2. Convertir une chaine binaire en type long
    Par MedyAndFriends dans le forum Langage
    Réponses: 10
    Dernier message: 16/12/2011, 20h39
  3. Réponses: 6
    Dernier message: 14/06/2006, 16h27
  4. Convertir une chaine en format heure
    Par Lars dans le forum ASP
    Réponses: 3
    Dernier message: 24/05/2005, 12h44
  5. Convertir une chaine UTF8 en ISO-8859-1
    Par eods dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 26/08/2004, 17h57

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