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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 481
    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 481
    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 481
    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 481
    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;
    }

+ 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