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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    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

+ 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