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 :

Conversion de char en uint8_t


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 175
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 175
    Par défaut Conversion de char en uint8_t
    Bonjour à tous,

    J'ai un doute concernant cette fonction, sachant que

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    _config_radio.deveui;
    à la valeur de
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
    => 8

    et
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    _config_radio.nwkskey;
    à la valeur de
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
    => 16

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    struct Config_radio {
     
        char c_appeui[100];		// FOR OTAA
        uint8_t appeui[8];		// FOR OTAA
     
        char c_deveui[100];		// FOR OTAA
        uint8_t deveui[8];		// FOR OTAA
     
        char c_appkey[100];		// FOR OTAA
        uint8_t appkey[16];		// FOR OTAA
     
        uint32_t devaddr;		// FOR ABP
      	char c_devaddr[11];		// FOR ABP
     
        char c_appskey[100];	// FOR ABP
        uint8_t appskey[16];	// FOR ABP
     
      	char c_nwkskey[100];	// FOR ABP
        uint8_t nwkskey[16];	// FOR ABP
     
      };
    Config_radio _config_radio;
     
    charToUint8_t(_config_radio.c_deveui + 1,_config_radio.deveui);
     
    void Foxuino::charToUint8_t(const char * key, uint8_t table[])
    {
      char * ptr;
      char buffer[100];
      const char* separateur = ",";
     
      strncpy(buffer, key, 100); // on le duplique pour ne pas toucher à key
      buffer[99] = '\0';
     
      ptr = strtok(buffer, separateur); // http://www.cplusplus.com/reference/cstring/strtok/
     
      int i = 0;
      while (ptr && i < 16) {
        table[i++] = strtol(ptr, NULL, 16); // http://www.cplusplus.com/reference/cstdlib/strtol/
        ptr = strtok(NULL, separateur);
      }
    }

    Le premier questionnement, c'est la taille du buffer. Est-ce necessaire qu'elle soit de 100, alors que la plus grande valeur (taille) est de 16 (ref: nwkskey)
    Le deuxième questionnement est la boucle
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (ptr && i < 16) {
        table[i++] = strtol(ptr, NULL, 16); // http://www.cplusplus.com/reference/cstdlib/strtol/
        ptr = strtok(NULL, separateur);
      }

    Initialement, cette fonction est prévue pour ceci
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    charToUint8_t(_config_radio.c_nwkskey + 1,_config_radio.nwkskey);
    sachant _config_radio.c_nwkskey a une taille de 16
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
    Donc que va-t-il se passer si _config_radio.c_deveui à une taille de 8.

    Voyez-vous mon souci? La boucle devrait etre comme ceci
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (ptr && i < 8) {
        table[i++] = strtol(ptr, NULL, 8); // http://www.cplusplus.com/reference/cstdlib/strtol/
        ptr = strtok(NULL, separateur);
      }

    Mais si je laisse cette dernier avec le numéro 16

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (ptr && i < 16) {
        table[i++] = strtol(ptr, NULL, 16); // http://www.cplusplus.com/reference/cstdlib/strtol/
        ptr = strtok(NULL, separateur);
      }

    que risque-t-il de se passer après le 9 -> 16 pour

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    _config_radio.deveui;
    qui a la valeur de
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
    => 8

    Est-ce que quelque chose vous interpelle?

    Merci pour vos lumières

  2. #2
    Nouveau candidat au Club
    Inscrit en
    Août 2012
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 2
    Par défaut
    Bonjour,

    Je me permets de faire remonter ce sujet car j'essaye de convertir un char en uint8_t.

    J'ai repris la fonction de conversion proposé ci-dessus mais lorsque j'essaye de faire un print (std::cout) de 'table[]' dans la boucle while, je n'ai rien.
    Par contre, lorsque je teste la fonction avec 'table' que j'ai changé en type long, j'arrive à afficher quelque chose. (ce qui semble normal car la fonction strtol renvoie un long.)

    Du coup, est-ce que quelqu'un saurait me dire si cette fonction de conversion de char en uint8_t fonctionne s'il vous plait ?

    Merci à vous.

  3. #3
    Membre émérite
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 381
    Par défaut
    Bonjour,

    Un uint8_t c'est un unsigned char.
    La fonction au-dessus ne peut pas fonctionner, il y a des confusions entre char, char*, taille des types, taille des tableaux et base de numération.

  4. #4
    Nouveau candidat au Club
    Inscrit en
    Août 2012
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 2
    Par défaut
    Merci pour votre réponse.

    J'ai un autre souci maintenant c'est que j'ai rempli un buffer de type char* que je passe à une fonction SEND_TCP,
    le buffer est rempli comme cela :
    buffer[0] = 0x00, buffer[1] = 0x01, buffer[2] = 0x02, et ainsi de suite.

    Sauf que quand j'observe ma trame sur le réseau, je vois que ce n'est pas 0x00 (je devrai observer 00 dans ma trame réseau) mais plutôt 0 puis x puis 0 puis 0.

    Comment puis-je faire pour que mon 0x00 soit interprété comme de l'hexadécimal ?

  5. #5
    Membre émérite
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 381
    Par défaut
    Il faudrait savoir si buffer doit contenir une chaîne de caractères ou une valeur numérique.

    S'il faut convertir la chaine de caractères "0x00" en valeur numérique c'est justement la fonction strtol qui permet de faire ça.

    C'est pour ça que j'indiquais qu'il y avait des confusions dans le code du premier message, car la ligne "table[i++] = strtol(ptr, NULL, 8);" correspond à une lecture en base 8, il fallait bien laisser 16.

Discussions similaires

  1. [Debutant] conversion de char en int
    Par Marc_3 dans le forum Langage
    Réponses: 9
    Dernier message: 31/08/2011, 12h02
  2. Conversion de char* en String^
    Par Sallie dans le forum MFC
    Réponses: 2
    Dernier message: 09/05/2006, 16h27
  3. Conversion de char en string...
    Par Empty_body dans le forum Oracle
    Réponses: 2
    Dernier message: 20/03/2006, 14h34
  4. conversion int---->char
    Par andurand dans le forum C++
    Réponses: 10
    Dernier message: 30/05/2005, 17h36
  5. Réponses: 2
    Dernier message: 01/07/2004, 11h36

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