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 tableau de caractère


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 24
    Par défaut Conversion tableau de caractère
    Bonjour,

    Je souhaiterai convertir un tableau de caractère qui contient des caractères hexadécimaux du big endian au little endian. Ensuite j'aimerai évaluer ce tableau de l'hexadécimal au décimal.

    Un exemple pour mieux voir tout ca.

    Mon programme reçois la chaine de caractères suivante : "02 00" dans un tableau.

    Je souhaite la convertir en "00 02" pour l'avoir en little endian.

    Et enfin je souhaite évaluer ces 2 bytes en décimal et ainsi dans ce cas avoir "2".

    Merci de votre aide.

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Ne@tsoul Voir le message
    Je souhaiterai convertir un tableau de caractère qui contient des caractères hexadécimaux du big endian au little endian.

    Un exemple pour mieux voir tout ca.

    Mon programme reçois la chaine de caractères suivante : "02 00" dans un tableau.

    Je souhaite la convertir en "00 02" pour l'avoir en little endian.
    Chaque valeur est codée sur 2 octets, c'est ça ?

    Il est à espérer que chaque chaine dispose d'un nombre pair d'octets.

    Le principe est de lire le fichier d'origine et d'écrire dans un autre tableau au fur et à mesure selon le principe bien établi :



    Je suggère :

    - d'extraire les valeurs 2 à 2 avec strtoul() et la base 16 dans 2 variables a et b
    - d'écrire les variable b et a dans un autre tableau avec sprintf() et "%02X" et respectant bien le format initial (espaces).

    Ca se fait en quelques lignes. Pas de difficulté majeures. Apprendre à utiliser le 2ème paramètre de strtoul(), ça aide bien.

    A la limite, on pourrait faire une manipulation purement textuelle en découpant les mots 2 à 2 et en les écrivant dans le sens inverse dans le nouveau tableau... strtok() peut aider...

    C'est pas forcément plus simple... Faut voir...
    Ensuite j'aimerai évaluer ce tableau de l'hexadécimal au décimal.
    ...
    Et enfin je souhaite évaluer ces 2 bytes en décimal et ainsi dans ce cas avoir "2".
    On évalue pas une valeur numérique dans une autre base que le binaire sur les machines actuelles...

    Je ne vois pas ce que tu veux dire. Une valeur est une combinaison de bits. Toujours.

    Seule la représentation textuelle fait référence à une base (10, 16 etc.)

  3. #3
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 24
    Par défaut
    Bonjour emmanuel,

    Je te remercie tout d'abord pour ta réponse.

    Pour la première étape du traitement, je vois ce que tu veux dire, je pense que ca sera bon, je vais le faire.

    Pour la seconde étape, je complète mon explication :

    En fait suite à la première étape, je vais passer d'une chaine de caractère "0F 00" à la chaine de caractère suivante "00 0F".
    Maintenant ce que j'aimerai c'est avoir une fonction qui prenne en paramètre cette chaine de caractère "00 0F" et qui me retourne 16. As-tu une idée de comment faire ?

    Merci d'avance !

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Ne@tsoul Voir le message
    En fait suite à la première étape, je vais passer d'une chaine de caractère "0F 00" à la chaine de caractère suivante "00 0F".
    Maintenant ce que j'aimerai c'est avoir une fonction qui prenne en paramètre cette chaine de caractère "00 0F" et qui me retourne 16.
    16 est une valeur numérique exprimée en décimal. Ce que tu veux faire, c'est une conversion texte -> numérique... C'est le but final ? As-tu vraiment besoin de la conversion précédente ? Quel est le vrai problème en fait ? J'ai l'impression que tu es parti sur des solutions plus compliquées qu'elles ne devraient l'être...
    As-tu une idée de comment faire ?
    Oui, mais ce qui m'étonne, c'est que toi, tu n'en ais pas... Il faut tout faire à ta place ?

  5. #5
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 24
    Par défaut
    conversion texte -> numérique : oui c'est le but final !

    Pour convertir du numérique en texte, on peut utiliser sprintf, mais dans l'autre sens il ne me semble pas connaitre de fonction qui fait ça... ou du moins je ne pense pas à les utiliser...

    Hum, c'est possible que je me sois compliqué, mais bon pour récapituler et faire simple voila ce que je chercher à faire:
    Je reçois la chaine de caractère suivante "0F00" je souhaite avoir en sortie un entier qui a pour valeur 16 ou la chaine de caractère suivante "0016".

    C'est fort possible que la solution soit toute simple, mais après quelques recherches sur google, je ne suis pas arrivé à mes fins ...
    Mon principal problème est pour convertir une chaine de caractère hexadécimal en int. Si je n'avais eu que "0F", un simple cast suffit ...
    Pour faire la conversion big/little endian, j'ai essayé d'utiliser les fonctions htonl, htons... mais je devais mal m'en servir ou c'était pas approprié.

    J'espère ne pas trop t'embrouiller dans mes explications ...

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Ne@tsoul Voir le message
    conversion texte -> numérique : oui c'est le but final !

    Pour convertir du numérique en texte, on peut utiliser sprintf, mais dans l'autre sens il ne me semble pas connaitre de fonction qui fait ça... ou du moins je ne pense pas à les utiliser...
    Je t'ai parlé de strtoul(). Tu ne lis pas les réponses ? Je perds mon temps à te répondre ?
    Je reçois la chaine de caractère suivante "0F00"
    C'est pas clair. Tu reçois "0F00" ou "0F 00" C'est pas pareil.
    je souhaite avoir en sortie un entier qui a pour valeur 16 ou la chaine de caractère suivante "0016".
    Tu veux une conversion en mode texte au format décimal ? Pourquoi 4 chiffres . FFFF vaut 65535. Il faut donc 5 chiffres. Ou alors, tu es certain de ne pas dépasser 4 digits (9999 soit en hexa : 270F)...
    Mon principal problème est pour convertir une chaine de caractère hexadécimal en int. Si je n'avais eu que "0F", un simple cast suffit ...
    certainement pas.
    Pour faire la conversion big/little endian,
    On peut tout faire en une opération. Ce qu'il faut, c'est une spécification claire.

    Pour commencer, je voudrais savoir précisément comment sont codées les données d'origine.

  7. #7
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 24
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je t'ai parlé de strtoul(). Tu ne lis pas les réponses ? Je perds mon temps à te répondre ?
    C'est pas clair. Tu reçois "0F00" ou "0F 00" C'est pas pareil.
    En fait je reçois un const unsigned char* buffer qui a pour valeur par exemple "0301000508186701". Cette chaine ne contient que des caractères hexadécimaux, donc il faut la lire "03 01 00 05 ...."
    Typiquement dans mon cas, je souhaite extraire la sous-chaine "0005", la convertir en little endian, et obtenir un entier. Donc au final, je veux avoir une valeur décimale.

    Citation Envoyé par Emmanuel Delahaye Voir le message
    Tu veux une conversion en mode texte au format décimal ? Pourquoi 4 chiffres . FFFF vaut 65535. Il faut donc 5 chiffres. Ou alors, tu es certain de ne pas dépasser 4 digits (9999 soit en hexa : 270F)...
    Je souhaite avoir une valeur décimale pour pouvoir la manipuler facilement dans mon programme.
    Dans ce cas précis, il y a une confusion de ma part puisque cette valeur décimale sera également utilisé pour nommer d'un fichier...
    Pour le nombre de chiffres, c'est une très bonne remarque, je vais poser la question à mon responsable, mais à prioris, le nombre de chiffres est 5 et une coquille s'est glissée !

    Je te remercie de ta patience et des efforts que tu fournis pour m'aider à résoudre mon problème, qui s'avère peut être très basique pour toi au final !

  8. #8
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 24
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je t'ai parlé de strtoul(). Tu ne lis pas les réponses ? Je perds mon temps à te répondre ?
    J'ai utilisé la fonction strtoul comme tu me l'as dis.

    J'extrais la sous chaine "0005" de ma chaine initiale avec la fonction memcpy(), et je la stocke dans un tableau de caractères.
    Puis lorsque j'utilise strtoul sur mon tableau, le résultat sorti n'est pas celui attendu ... je dois mal utiliser cette fonction peut être...

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Ne@tsoul Voir le message
    En fait je reçois un const unsigned char* buffer qui a pour valeur par exemple "0301000508186701". Cette chaine ne contient que des caractères hexadécimaux, donc il faut la lire "03 01 00 05 ...."
    Typiquement dans mon cas, je souhaite extraire la sous-chaine "0005", la convertir en little endian, et obtenir un entier. Donc au final, je veux avoir une valeur décimale.
    Je ne comprends pas tes histoire d'endianess. C'est hors-sujet. Il suffit de convertir la sous-chaine "0005" en numérique avec strtoul() dans une unsigned int et on obtient la combinaison de bits ... 0000 0000 0000 0101 soit, en décimal, la valeur 5. C'est tout. Ensuite, pour la convertir en chaine décimale formatée de largeur 5 avec des 0 en tête, il suffit d'utiliser sprintf() avec "%05u".

    Pour extraire la sous-chaine, strncat() peut aider. Bien lire la doc.

    Fait de ton mieux et poste ton code.

    On doit obtenir ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    sdata = '0005'
    data = 5
    sdec = '00005'
     
    Process returned 0 (0x0)   execution time : 0.041 s
    Press any key to continue.
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    int main (void)
    {
       const char *buffer = "0301000508186701";
     
       char sdata[5];
     
       *sdata = 0;
       strncat (sdata, buffer + 4, sizeof sdata - 1);
     
       printf ("sdata = '%s'\n", sdata);
       {
          unsigned long data = strtoul (sdata, NULL, 16);
          printf ("data = %lu\n", data);
          {
             char sdec[6];
     
             sprintf (sdec, "%05lu", data);
             printf ("sdec = '%s'\n", sdec);
          }
       }
       return 0;
    }

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Ne@tsoul Voir le message
    J'ai utilisé la fonction strtoul comme tu me l'as dis.

    J'extrais la sous chaine "0005" de ma chaine initiale avec la fonction memcpy(), et je la stocke dans un tableau de caractères.
    Puis lorsque j'utilise strtoul sur mon tableau, le résultat sorti n'est pas celui attendu ... je dois mal utiliser cette fonction peut être...
    Normal. memcpy() n'ajoute pas le 0 final. Voir strncat()...

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/06/2023, 15h51
  2. Convertir une string en tableau de caractères
    Par alainpeniche dans le forum C++
    Réponses: 4
    Dernier message: 06/01/2007, 20h00
  3. convertir un tableau de caractère en float
    Par zerocoolyoussef dans le forum C
    Réponses: 3
    Dernier message: 20/03/2006, 22h27
  4. Conversion d'un caractère en minuscule!!
    Par feanor77 dans le forum C
    Réponses: 19
    Dernier message: 11/12/2005, 14h33

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