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 :

BYTE en Hexadecimal dans char*


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut BYTE en Hexadecimal dans char*
    Bonjour,
    Je suis débutant en C et j'ai un problème de conversion voire même d'assignation de variable.

    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
    char sel0[28];
    unsigned long int intValSel0[30];
     
     	for(i=0; i<dwvLength; i++){
    	 //sel0[i] = pbvBuffer[i];
     
    	//intValSel0[o] = strtol(pbvBuffer[i], NULL, 16);
    	//sprintf(&sel0[2*i],"%02x", pbvBuffer[i]);
     
    	printf("%02X", pbvBuffer[i]);
    	}
     
     //char *sel2 = binaire(atoi(sel0), bufsel2, 216);
     printf("\nSEL:%x/", sel0[0]);
     printf("\n");
    Ce printf :
    printf("%02X", pbvBuffer[i]);
    fonctionne bien et m'affiche bien une suite d'octets de la forme 5D4F9C44692F. Seulement je n'arrive pas à récupérer ce pbRecvBuffer[i] dans une variable pour l'utiliser ensuite...
    Il semblerait qu'il soit du type BYTE (je le dis au cas où, je ne sais pas si ça change quelque chose).

    Une fois récupérée, cette valeur sera transformée en binaire tel que 011010101101011...etc

    Ce qui est en commentaire, ce sont juste des tests.

    Ceci :
    printf("\nSEL:%x/", sel0[0]);
    ne m'affiche jamais 5, ni 5D, ni D, enfin bref rien en rapport avec ma suite d'octets...

    Merci pour votre aide

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Comment est-ce que tu peux utiliser une variable, pbRecvBuffer en l'occurence, sans même savoir ce que c'est . Poste un code qui compile qu'on puisse bien voir stp. Un code qui compile veut dire une fonction complète au moins, et qui compile .

    printf("\nSEL:%x/", sel0[0]); ne m'affiche jamais 5, ni 5D, ni D, enfin bref rien en rapport avec ma suite d'octets...
    Dans le code que tu as posté, je ne te vois même jamais initialiser sel0[0]. Que veux-tu qu'il y ait dedans ?

    D'ailleurs, que veux-tu faire au juste ? Je n'ai toujours pas compris .

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    Ah j'ai peut-être mal expliqué mon problème mais entre temps j'ai réussi à mettre ce byte dans ma variable sel0 grâce à sprintf comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sprintf(&sel0[2*i],"%02X", pbvBuffer[i]);
    Du coup j'arrive à mon second problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char ks[120];
    sprintf(ks,"%s",sel0);
     
    //ks contient 30 octets de la forme 5E4F625823D12C44BC23A5.. donc en tout 120 caractères hexadécimal
    Je souhaite donc juste convertir chaque caractère hexadécimal en binaire de manière très simple, et donc avoir en résultat un tableau d'entier de (4*120bits) 480 bits.

    Je n'y arrive pas, ça fait 1 semaine que je bloque sur ces problèmes relativement simple...

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 214
    Par défaut
    Si printf n'affiche pas un nombre en binaire, fais-le toi-même !

    Tu es arrivé à avoir un nombre hexadécimal. Donc tu dois juste convertir en série chaque caractère hexa en série de 4 caractères (0 ou 1).

    Un caractère hexa, c'est de 0 à F, soit 16 cas possible. Pas besoin d'une quelconque fonction pour cela. C'est le piège quand on début, on cherche LA fonction qui fera ce qu'on cherche, alors qu'avec les opérateurs de base du langage, tu fais ça en quelques minutes.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    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 461
    Par défaut
    Citation Envoyé par quake3 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char ks[120];
    sprintf(ks,"%s",sel0);
     
    //ks contient 30 octets de la forme 5E4F625823D12C44BC23A5.. donc en tout 120 caractères hexadécimal
    Non. Trente octets en binaire naturel, ça se représente avec 60 caractères hexadécimaux. Pas 120. Ensuite, je n'ai pas encore compris exactement ce que tu cherches à faire :

    — Est-ce que ks[] contient une chaîne de caractères, c'est-à-dire le nombre hexadécimal prêt à être affiché à l'écran, ou est-ce qu'il contient des données en binaire pur et dont la valeur correspondrait au nombre hexadécimal que tu nous présentes ?
    — Est-ce que tu comptes convertir ces données en binaire pur en mémoire, veux-tu les afficher en hexadécimal, ou veux-tu afficher le binaire à l'écran ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    @Jérôme_C : Je sais que c'est la chose à faire et j'ai bien essayé (toute la journée, et j'y suis encore) mais je n'y arrive pas, j'ai toujours des erreurs de ce genre :
    warning: initialization makes integer from pointer without a cast
    @Obsidian :
    Désolé j'ai mis 30 octets alors que c'était 60 octets.

    Quand je printf la variable ks comme ceci :
    J'obtiens 120 caractères hexadécimaux de la forme 5E4F625823D12C44BC23A5...

    Je veux juste prendre cette variable ks et la mettre dans un autre char :

    5E4F625823D12.. serait donc 0101111001001111011000100101100000100011110100010010..

    Désolé si je m'explique mal mais pour moi les char, char[], char *, const char*, c'est pas très clair pour moi encore, j'ai l'habitude de faire du c# où on utilise juste le type string et c'est beaucoup plus simple pour moi donc n'hésitez pas à me poser des questions, je ferais ce que je peux pour y répondre le plus précisément possible. Merci déjà pour votre temps

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    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 461
    Par défaut
    Citation Envoyé par quake3 Voir le message
    Désolé si je m'explique mal mais pour moi les char, char[], char *, const char*, c'est pas très clair pour moi encore, j'ai l'habitude de faire du c# où on utilise juste le type string et c'est beaucoup plus simple pour moi donc n'hésitez pas à me poser des questions, je ferais ce que je peux pour y répondre le plus précisément possible. Merci déjà pour votre temps
    Le problème n'est pas là. On ne savait pas si tu voulais convertir ton nombre hexadécimal en binaire natif en mémoire ou afficher à l'écran (ou à travers un buffer) sa représentation en binaire humainement lisible. Il semble que ce soit la deuxième option.

    Tu pourrais passer facilement par strtol(), sscanf() et les autres fonctions C habituelles pour ne pas avoir à réinventer la roue, mais si tu ne maîtrises pas encore le langage, ce n'est pas ce qu'il y a de plus simple. Donc, le mieux est encore d'écrire ton propre convertisseur :

    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
    #include <stdio.h>
     
    int main (void)
    {
        /* On fait l'hypothèse sur CHAR_BIT = 8 et donc que 1 char = 1 octet */
     
        char ks[120] = "5E4F625823D12C44BC23A5..";
        char sortie[480];
        int i,j;
     
        for (i=0;i<(int)sizeof ks;i++)
        {
            char c;
     
            sortie[i*4]='\0';
     
            if      (ks[i]>='0' && ks[i]<='9') c = ks[i] - '0';
            else if (ks[i]>='A' && ks[i]<='F') c = ks[i] - 'A' + 10;
            else if (ks[i]>='a' && ks[i]<='f') c = ks[i] - 'a' + 10;
            else break;
     
            for (j=0;j<4;j++) sortie[i*4+j] = (c & (1<<(3-j))) ? '1' : '0';
        }
     
        printf ("    ks : %.*s\n",(int)sizeof ks,ks);
        printf ("sortie : %.*s\n",(int)sizeof sortie,sortie);
     
        return 0;
    }

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    Merci beaucoup, c'est exactement ce que je voulais faire !

    J'avais fait quelque chose de similaire mais en gros il me manquait l'équivalent de cette ligne à chaque fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (j=0;j<4;j++) sortie[i*4+j] = (c & (1<<(3-j))) ? '1' : '0';

    En tout cas merci infiniment votre temps précieux pour une question qui j'imagine n'est pas des plus intéressante lorsque l'on connaît bien le C.

    En tout cas, merci beaucoup pour votre aide, je vais pouvoir finir mon programme en C et j'espère ne plus avoir à en faire

    Merci

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    Juste une petite question, lorsque je printf ce tableau en %d j'obtiens comme valeur "48" ou "49". Je voudrais qu'au lieu de cela, obtenir les 0 et 1 que je vois avec le %.*s car après c'est pour faire un & logique avec un autre char[480] et la ça ne marchera pas en fait :/

    Je sais que je peux faire une boucle pour remplacer les 48 en 0 et les 49 en 1 mais je trouve ça pas très propre, Y'a t-il un autre moyen ?

    Du coup j'ai l'impression de comprendre ce que vous disiez :
    Le problème n'est pas là. On ne savait pas si tu voulais convertir ton nombre hexadécimal en binaire natif en mémoire ou afficher à l'écran (ou à travers un buffer) sa représentation en binaire humainement lisible. Il semble que ce soit la deuxième option.
    Il semblerait que ce que je veuille soit plutôt la première option si j'ai bien compris ?

  10. #10
    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
    (Je n'ai lu que le dernier message)

    Ton char ne contient pas 1 ou 0 mais '1' ou '0', c'est-à-dire un code ASCII correspond à ces caractères. Les codes de ces caractères sont 48 et 49.

    Tu peux faire printf("%d", monChar - '0');, ce qui va en fait afficher le résultat de la différence entre les codes ASCII de monChar et du caractère '0'.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    Merci beaucoup, je m'en suis sorti ! Merci à vous tous, heureusement que vous êtes la, ça aide vraiment surtout quand on débute! Merci encore !

  12. #12
    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
    De rien

    Bonne chose que tu t'en sois sorti. Bonne continuation.

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

Discussions similaires

  1. array byte string hexadecimal
    Par ouiouioui dans le forum Débuter
    Réponses: 6
    Dernier message: 29/01/2010, 18h07
  2. Envoyé 0x0 dans char* TCP
    Par maitrelame2 dans le forum Réseau
    Réponses: 1
    Dernier message: 28/03/2008, 09h09
  3. Réponses: 2
    Dernier message: 11/07/2007, 19h01
  4. Signification hexadecimal dans un .exe
    Par al754 dans le forum Assembleur
    Réponses: 7
    Dernier message: 12/06/2007, 20h03
  5. probleme de BYTE[8] et de char*
    Par LesLemmings dans le forum C++
    Réponses: 21
    Dernier message: 12/04/2007, 13h16

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