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 :

Afficher un int16_t en ASCII


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 57
    Par défaut Afficher un int16_t en ASCII
    Bonjour à tous !

    J'ai du mal à trouver une méthode propre pour afficher un int16_t en ASCII.

    Je m'explique :

    Je possède une variable de type int16_t qui contient le code ASCII de 2 caractères. Je souhaite afficher le contenu de cette variable en ASCII.

    Exemple :
    Ma variable int16_t contient 0x3031.
    Je souhaite donc afficher "01".

    J'ai bien réussi à faire un truck de bidouilleurs en C pure avec des memcpy ; Mais c'est pas très propre et surtout pas du C++.

    Avez vous une idée de la chose ?

    Je vous remercie d'avance !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Moi, je ferais un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int ASCII=0x3031;
    unsigned char v1=ASCII>>8;
    unsigned char v2=ASCII & 0x00FF;
    char ASCII_t[3];
    ASCII_t[0]=v1;
    ASCII_t[1]=v2;
    ASCII_t[2]='\0';
    C'est bon.
    Dernière modification par Invité ; 09/11/2010 à 19h09.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <cstdint>
    #include <iostream>
    int main()
    {
        int16_t v=0x3031;
        std::cout<<static_cast<char>((v>>8)&0xFF)<<static_cast<char>(v)<<"\n";
        std::wcout<<static_cast<wchar_t>((v>>8)&0xFF)<<static_cast<wchar_t>(v&0xFF)<<L"\n";
       return 0;
    }
    Ou de façon plus explicite :
    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
    #include <cstdint>
    #include <iostream>
    inline uint8_t low_byte(uint16_t v_)
    {
        return static_cast<unsigned char>(v_&0xFF);
    }
     
    inline uint8_t hi_byte(uint16_t v_)
    {
        return static_cast<unsigned char>((v_>>8)&0xFF);
    }
     
    int main()
    {
        int16_t v=0x3031;
        std::cout<<static_cast<char>(hi_byte(v))<<static_cast<char>(low_byte(v))<<"\n";
        std::wcout<<static_cast<wchar_t>(hi_byte(v))<<static_cast<wchar_t>(low_byte(v))<<L"\n";
       return 0;
    }

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    Par défaut
    Salut,

    Tu pourrais te baser sur cette entrée de la FAQ, et principalement sur les fonctions template qu'elle présente, car elle est adaptée à n'importe quel flux d'entrée / sortie (tu peux donc parfaitement envisager de passer std::cou à write .

    Il faut cependant être conscient que tu risque d'être confronté à un problème d'organisation des bytes en mémoire, car, comme le font apparaitre les codes présentés par mes honorable confrères, la partie "0x30" trouve place dans... le deuxième byte de ton (u)int16_t.

    Cependant, étant donné que (u)int16_t est un type primitif représentant
    • une valeur numérique, j'envisage (mais je peux en oublier) trois trois manières possibles dont on pourrait en effectuer l'affichage:
    • sous la forme du caractère représentant chaque byte de la valeur (un peu à la manière des éditeurs hexadécimaux)
    • sous la forme de la valeur qu'il représente, que ce soit en décimal, en hexadécimal ou en binaire
    • éventuellement sous la forme d'un "caractère multybyte"
    A mon sens, la position des bytes en mémoire n'aura donc que peu d'importance, vu que le système interprétera correctement la valeur
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Pour un exercice de style, la méthode donnée par 3DAchi est parfaite, par contre, pour un traitement le code donné en première réponse est deux fois plus rapide. (soit 655274 passages contre 318667 en 10 secondes)
    Par ailleurs, le type int16_t est défini dans stdint.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef __int16 int16_t;

  6. #6
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Bonjour,
    Pour un exercice de style, la méthode donnée par 3DAchi est parfaite, par contre, pour un traitement le code donné en première réponse est deux fois plus rapide. (soit 655274 passages contre 318667 en 10 secondes)
    Je possède une variable de type int16_t qui contient le code ASCII de 2 caractères. Je souhaite afficher le contenu de cette variable en ASCII.
    Le PO parle d'afficher ...

    Citation Envoyé par Pierre Dolez Voir le message
    Par ailleurs, le type int16_t est défini dans stdint.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef __int16 int16_t;
    Les entêtes standards en *.h sont deprecated en C++ et remplacés par un fichier commençant par un 'c' et sans le .h ie :
    <stdint.h> => <cstdint>

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Bonjour,
    Pour un exercice de style, la méthode donnée par 3DAchi est parfaite, par contre, pour un traitement le code donné en première réponse est deux fois plus rapide. (soit 655274 passages contre 318667 en 10 secondes)
    Par ailleurs, le type int16_t est défini dans stdint.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef __int16 int16_t;
    On pourrait voir l'intégralité du code utilisé pour le bench (les 2 codes). Bench en mode release, j'imagine .

    Hormis ces petits détails, chercher les performances dans de l'affichage c'est un peu contradictoire

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bien volontiers

    Solution1
    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
    int main()
    {
      int ASCII=0x3031;
      clock_t start, end;
      start = clock();
      unsigned long Compte=0;
      char ASCII_t[3];
      do
      {
        unsigned char v1=ASCII>>8;
        unsigned char v2=ASCII & 0x00FF;
        char ASCII_t[3];
        ASCII_t[0]=v1;
        ASCII_t[1]=v2;
        ASCII_t[2]='\n';
        write(1, ASCII_t, 3);  
        end = clock();
        Compte++;
      }
      while ( ((end - start) / CLK_TCK) < 10);  // 10 secondes
      printf(" Compte = %d  pour 10 S.\n", Compte);
     
      system("Pause");
      return 0;
    }
    Solution 2
    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
    int main()
    {
      int16_t v=0x3031;
      clock_t start, end;
      start = clock();
      unsigned long Compte=0;
      do
      {
        std::cout<<static_cast<char>((v>>8)&0xFF)<<static_cast<char>(v)<<"\n";
        end = clock();
        Compte++;
      }
      while ( ((end - start) / CLK_TCK) < 10);  // 10 secondes
      printf(" Compte = %d  pour 10 S.\n", Compte);
     
      system("Pause");
      return 0;
    }
    Hormis ces petits détails, chercher les performances dans de l'affichage c'est un peu contradictoire
    Je ne cherche rien. Simplement j'ai voulu me rendre compte des différences de temps d'exécution, et cela m'a paru intéressant de donner l'information.
    Il y a lieu de remarquer que dans les 2 traitements, il y a une constante (appel à clock(), test de délai et impression), identique dans les 2 traitements.

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut

    Tu prouves que write est plus performant que std::cout Comment en faisant varier plusieurs paramètres de comparaison, peux-tu dire celui qui est discriminant Et les sorties consoles restent toujours aléatoires pour les mesures de perfs . Tes mesures étaient bien en release et pas en debug ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Tu prouves que write est plus performant que std::cout
    Oh, moi je prouve rien.
    J'exécute 2 codes qui font le même chose, j'informe, et puis c'est tout.
    Chacun fait comme il veut, chacun donne les informations qu'il constate, il s'agit d'un forum, et pas d'une tribune.
    Je n'ai rien dit, j'ai juste donné des résultats. Je n'en tire d'ailleurs aucune conclusion.

    Si on veut être plus précis, on peut toujours exécuter ce code, sans aucun traitement, seulement le comptage et le calcul des 10 s., noter le nombre de passages, c'est à dire la partie fixe et commune aux deux traitements, par une simple soustraction, on en déduira la différence réelle entre les deux type de traitements.
    Tes mesures étaient bien en release et pas en debug ?
    J'ai fait l'exécution plusieurs fois en "release" avec 10s et 5s.
    Le bon moyen est de le faire vous-même.
    Moi, ça m'est complètement égal, j'ai proposé un code, vous en avez proposé un autre (au passage vous m'avez mis une note négative) que voulez- vous que je vous dise de plus?

  11. #11
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    Par défaut
    Ce que 3DArchi exprime à juste titre, c'est que tu manipule d'un coté une fonction write et de l'autre un flux de sortie, tous deux pris en compte dans le temps que dure ton test.

    Tu peux donc, au mieux, déduire de write est plus efficace que l'utilisation de cout, mais tu ne peux en aucun cas déduire que ton code en vue de convertir la valeur de l'int16_t soit plus efficace.

    On ne juge pas le code en lui-même, on juge la conclusion que tu en tire, car elle n'est absolument pas fondée
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour Koala,
    Voila ce que j'ai écrit
    Je n'ai rien dit, j'ai juste donné des résultats. Je n'en tire d'ailleurs aucune conclusion.
    Et voilà ce que vous me répondez :
    On ne juge pas le code en lui-même, on juge la conclusion que tu en tire, car elle n'est absolument pas fondée

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 57
    Par défaut
    Bon, malgré cette petite querelle, je vous remercie tous pour avoir répondu à ma question.

    Problème résolu !

    Par contre, pouvez vous m'expliquer la différence entre ces deux lignes ?

    std::cout<<static_cast<char>((v>>8)&0xFF)<<static_cast<char>(v)<<"\n";
    std::wcout<<static_cast<wchar_t>((v>>8)&0xFF)<<static_cast<wchar_t>(v&0xFF)<<L"\n";
    Merci d'avance !

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    CF F.A.Q. : Comment manipuler des chaînes de caractères Unicode ?
    En gros :
    > std::string (qui n'est jamais qu'un std::basic_string<char>) + std::cout => ANSI
    > std::wstring (qui n'est jamais qu'un std::basic_string<wchar_t>) + std::wcout => unicode

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 57
    Par défaut
    Dac j'ai compris !

    Merci encore.

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

Discussions similaires

  1. Afficher dans un code ASCII
    Par Maglight dans le forum Débuter
    Réponses: 4
    Dernier message: 19/09/2008, 09h20
  2. Comment afficher une chaine de caractère en ascii
    Par nandofive dans le forum VB.NET
    Réponses: 3
    Dernier message: 15/01/2008, 13h11
  3. afficher un caractère à partir de son code ascii
    Par baguinga dans le forum Débuter
    Réponses: 10
    Dernier message: 15/10/2007, 18h39
  4. Afficher des caractères et leur code ASCII
    Par hamada_10 dans le forum Pascal
    Réponses: 8
    Dernier message: 26/12/2006, 19h38
  5. Afficher un caractère ASCII en C
    Par Talfox dans le forum C
    Réponses: 3
    Dernier message: 06/01/2006, 11h50

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