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 :

Compter le nombre d'éléments d'un hexadécimal


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 5
    Par défaut Compter le nombre d'éléments d'un hexadécimal
    Bonjour à tous et merci d'avance pour votre aide.

    Voilà, pour commencer, je travaille en C sur microcontroleur (STM32F4), j'essaie donc dans la mesure du possible de limiter mon utilisation des bibliothèques du C.

    Je voudrais trouver un moyen de calculer le nombre d'éléments d'un chiffre Hexa (exemple 0x02CFF300). J'ai essayé un truc comme ça qui me paraissait pas mal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    uint32_t hexatest = 0x02CFF300;
    char chaine[20]={'0'};
    int longueur = sprintf(chaine,"%x",hexatest);
    chaine[0] 2
    chaine[0] C
    chaine[0] F
    chaine[0] F
    chaine[0] 3
    chaine[0] 0
    chaine[0] 0

    longueur 7


    Le problème est que le premier zéro saute systématiquement dans le tableau et que j'ai donc dans longueur '7', ce qui est faux. Ce premier zéro est tres important dans mon application puisque c'est un quartet passé ensuite à un écran, qui doit savoir que 4 pixels sont vides. Je ne trouve pas d'autre solution pour mesurer le nombre de quartet de mon chiffre Hexa, je bloque, si l'un de vous a une idée ce serait génial.

    Merci encore,

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Bonjour,

    Un chiffre hexadécimal représente exactement 4 bits. C'est d'ailleurs pour cela qu'on s'en sert : ça permet de passer immédiatement du binaire à l'hexa et vice-versa sans avoir à faire de calcul et le nombre de bits que l'on obtient reste compatible avec le format des mots binaires utilisées par toutes les machines encore en état de fonctionner.

    Pour compter le nombre de chiffres hexa, il te suffit de supprimer des blocs de quatre bits par la droite jusqu'à ce que ton nombre devienne nul :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        uint32_t hexatest = 0x02CFF300;
        int      count    = 0;
     
        while (hexatest) { count++; hexatest >>=4; }
    Maintenant, si tu veux tenir compte des zéros non significatifs, alors c'est le format de « uint32_t » qu'il faut connaître, parce qu'il est fixe. En l'occurrence, uint32_t signifie « entier non signé de 32 bits ». Il est donc toujours formé de 8 chiffres hexadécimaux exactement.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    @Obsidian : tu comptes le nombre de digits utiles, non ? 0x00000000 te donnera 0. 0x0000001 te donnera 1. Ton exemple donnera 7. Or, je pense que Pete_Rebeat voudrait obtenir 8. (EDIT: en fait, c'est ce qu'il y après ton bloc CODE )

    Est-ce que sizeof(hexatest) * 8 / 4 ne fait pas l'affaire ?

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Est-ce que sizeof(hexatest) * 8 / 4 ne fait pas l'affaire ?
    voire même sizeof(uint32_t) * 8 / 4 (comme cela, pas de variable locale à déclarer)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 5
    Par défaut
    Merci pour ces réponses. Ces solutions sont bonnes, sauf qu'elles ne fonctionneront pas pour un nombre avec moins de 8 quartets.

    En l'occurence si j'ai une variable du style hexatest=0x02FF3, je voudrais retourner longueur=5, en tenant compte du premier zéro non significatif donc. D'autres idées?

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    une solution bourrin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(nombre <= 0x0000000f) len = 2;
    else if(nombre <= 0x000000ff) len = 3;
    else if(nombre <= 0x00000fff) len = 4;
    ...
    Si tu n'exécute pas trop souvent ce code, c'est très rapide

    C'est bourrin, je vous avais prévenu
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    @Pete_Rebeat: Impossible sans stocker l'information quelque part, car toi seul sais que le nombre est censé être affiché sur 5 chiffres même s'ils ne sont pas significatifs.
    Il n'existe pas de type "nombre de 20 bits".

    Par contre, tu peux faire une struct hexNumber { int value, int nbBits } pour stocker explicitement le nombre de bits du nombre...

    ----------------------------------------------------------------

    Au passage, cette demande est vraiment bizarre. Pourquoi as-tu besoin d'un tel comportement? Que cherches-tu à faire, au juste?
    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.

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Citation Envoyé par Bktero Voir le message
    (EDIT: en fait, c'est ce qu'il y après ton bloc CODE )
    C'est ma faute, désolé : j'ai posté trop vite et ai édité mon message juste après pour y ajouter le complément. Tu devais donc déjà être en train de lire la première partie. :-)

    Citation Envoyé par ram-0000 Voir le message
    voire même sizeof(uint32_t) * 8 / 4 (comme cela, pas de variable locale à déclarer)
    Ou encore, tant qu'à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        (sizeof hexatest) * CHAR_BIT / 4

    … comme ça, ça fonctionnera partout ! :-)

    Citation Envoyé par Pete_Rebeat Voir le message
    Merci pour ces réponses. Ces solutions sont bonnes, sauf qu'elles ne fonctionneront pas pour un nombre avec moins de 8 quartets.

    En l'occurence si j'ai une variable du style hexatest=0x02FF3, je voudrais retourner longueur=5, en tenant compte du premier zéro non significatif donc. D'autres idées?
    Je ne suis pas sûr de comprendre où tu veux en venir mais, si c'est bien ce à quoi je pense, sache qu'un nombre entier a un format fixe et qu'il ne s'agit pas du tout d'une chaîne de caractères. En l'occurrence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        uint32_t hexatest = 0x14f;
        uint32_t hexatest = 0x0014f;
        uint32_t hexatest = 0x000014f;
        uint32_t hexatest = 0x0000014f;
    … sont des expressions strictement équivalentes. Elles codent toutes la même valeur et seront toutes représentées sur 32 bits dans un uint32_t, quoi qu'il se passe. Et parce que uint32_t comporte exactement 32 bits, tu ne pourras jamais y stocker plus de 8 chiffres hexadécimaux.

    Si c'est une suite de chiffres hexadécimaux de taille arbitraire que tu veux stocker puis traiter, et que cette chaîne peut éventuellement s'allonger jusqu'à plusieurs dizaines de chiffres, alors soit tu utilises un chaîne de caractères pour faire simple, soit tu déclares un tableau d'octets et tu y stockes tes chiffres par paire. Dans les deux cas, tu itères sur les élements, du premier au dernier.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 20/09/2019, 22h36
  2. Réponses: 1
    Dernier message: 13/02/2007, 09h54
  3. Réponses: 2
    Dernier message: 21/10/2006, 10h26
  4. Réponses: 2
    Dernier message: 28/04/2006, 13h28
  5. Compter le nombre d'élément dans un tableau
    Par cryptorchild dans le forum Langage
    Réponses: 6
    Dernier message: 08/07/2005, 13h01

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