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 :

Affichage hexa d'une chaîne de char (string)


Sujet :

C++

  1. #1
    Membre éprouvé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Points : 1 214
    Points
    1 214
    Par défaut Affichage hexa d'une chaîne de char (string)
    Bonsoir à tous !

    Tout est dans le titre :

    J'ai une chaîne de caractères de type std::string str = "Hello World ����[Xø��؎���м�"

    Et je voudrais la voir affichée de manière hexa, avec une philosophie proche de
    std::cout << sdt::hex << str
    Mais bien sûr la ligne ci-dessus ne marche pas.

    J'ai donc pensé à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    std::cout << MBR  << "\n\n";
     
        std::cout.fill('0');
        for(unsigned int i=0,c=0;i<MBR.length();i++)
        {
          c = static_cast<unsigned char>(MBR[i]);
          std::cout.width(2);
          std::cout << std::hex << c << " ";
        }
    Ce qui me donne :
    e9 14 00 50 53 ac 3c 00 74 0a b4 0e bb 07 00...
    (que soit dit en passant je préfère à 0xe9 0x14 0x00 0x50 0x53... qui elle est un peu lourde)
    Et je voulais savoir si il n'y avais pas plus direct que de parcourir char par char, et si non, si ce que j'ai fait est correcte au niveau "propreté" ou "sécurité"

    Voilà merci d'avance pour vos réponses

    The magic of Opera, La magie de l'Opera
    The mysteries of Space Opera, Les mystères de l'Opera Spatial
    Mr. Know-it-all, M. Je-Sais-Tout
    Prelude in C sharp minor, the most beautiful piano song and the best C sharp prelude ever, Prélude en do dièse mineur, le plus beau morceau de piano et le meilleur prélude au C#
    The Mesmerizing Saphir Division for Nerds, L'Hypnotisante Division Saphire pour les Nerds (HDSN)

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Moi, je ferais cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    unsigned char Chaine[128];
    strcpy(Chaine,MBR.c_str());
    for (unsigned char *c=Chaine; c; c++) printf("%2x ",c);
    printf("\n");
    Sauf faute, ça devrait marcher, mais c'est du C
    J'ai dimensionné Chaine à 127 caractères + 0 terminal.
    C'est à vous de voir.
    Dernière modification par Invité ; 25/07/2010 à 11h41.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    Que penses tu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main()
    {
        std::string str("Hello World ����[Xø��؎���м�");
        for(size_t i=0;i<str.size();++i)
            std::cout<<std::hex<<(short)str[i]<<std::endl;
        return 0;
    }
    Tout simplement...

    Hé oui, la classe string redéfini l'opérateur [] pour renvoyer le caractère qui se trouve à l'indice indiqué.

    Il faut "juste" penser à le transtyper dans un type connu comme étant une représentation numérique

    Nous pourrions faire un cast en int ou long, cela ne changerait pas grand chose
    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

  4. #4
    Membre éprouvé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Points : 1 214
    Points
    1 214
    Par défaut
    Bonsoir, merci de vos réponses :

    @Pierre Dolez : comme tu le dit, on tombe dans du C ! et bien que celà ne soit pas grave en soit pour moi, ça empêche notament la réutilisation de cette chaîne (alors qu'on aurait pu en c++ la balancer dans un ostream, pas nécessairement cout).

    @koala01
    Hé oui, la classe string redéfini l'opérateur [] pour renvoyer le caractère qui se trouve à l'indice indiqué.

    Il faut "juste" penser à le transtyper dans un type connu comme étant une représentation numérique

    Nous pourrions faire un cast en int ou long, cela ne changerait pas grand chose
    Je le sais bien

    Citation Envoyé par cs_ntd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(unsigned int i=0,c=0;i<MBR.length();i++) //c est un entier
        {
          c = static_cast<unsigned char>(MBR[i]); //un char, transtypé en uchar, puis en int donc, en utilisant l'opérateur []
          std::cout.width(2);
          std::cout << std::hex << c << " ";
        }
    En passant, si on oublie de le reconvertir les char en uchar, toute valeur au-dela de 7f (127), un int prend la valeur ffffffxx.
    (char=0x8a => int=0xffffff8a).

    Mais en résumé pas d'autres solutions que un 'for' donc je pense que je vais arrêter de m'embèter et voilà tout

    The magic of Opera, La magie de l'Opera
    The mysteries of Space Opera, Les mystères de l'Opera Spatial
    Mr. Know-it-all, M. Je-Sais-Tout
    Prelude in C sharp minor, the most beautiful piano song and the best C sharp prelude ever, Prélude en do dièse mineur, le plus beau morceau de piano et le meilleur prélude au C#
    The Mesmerizing Saphir Division for Nerds, L'Hypnotisante Division Saphire pour les Nerds (HDSN)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Effectivement, c'est beaucoup plus simple.
    J'ai honte de n'y avoir pas pensé.
    @cs_ndt
    La chaine est stockée dans Chaine. Elle est donc toujours disponible dans le module. J'utilise cette méthode pour afficher un fichier, à gauche en hexa, à droite en caractères. L'impression contient 16 caractères par ligne, les adresses (décimal et hexa) les caractères 2x8 en hexa, puis les caractères alpha. Cela me permet de visualiser un fichier pour toute sorte de besoins, décodage en particulier.
    En fait, dans le code que j'ai indiqué, je suppose qu'on veut écrire une chaine. Je pense que dans le cas général, dans le cas de mon listing de fichier en particulier, ce n'est pas une chaine qu'on visualise, mais un fichier.
    Il ne faut pas oublier que le code revient forcément à un "printf("%0.2x ",c);" même si on passe par un container.
    Dernière modification par Invité ; 25/07/2010 à 00h41.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Ah... C'est la boucle for qui t'ennuie... fallait le dire (même si en fait j'avais lu un peu trop vite...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream> 
    #include <sstream>
    #include <string>
    #include <iterator>
    void foo(std::string const & str)
    {
        std::ostringstream oss;
        oss<<std::hex<<std::uppercase;
        std::copy(str.begin(),str.end(),std::ostream_iterator<int>(oss, "\n"));
        std::cout<<oss.str();
        return 0;
    }
    [EDIT]J'oubliais: un lien vers la FAQ dont tu peux t'inspirer

    [EDIT 2]Au passage... je ne suis, personnellement, pas trop favorable à l'utilisation (de manière générale) de deux ou plusieurs variables dans les parenthèses d'une boucle for...

    Je sais qu'il est tout à fait légal d'écrire un code comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i=0, j=10;i<10;++i,--j)
    mais je trouve que c'est un sucre syntaxique qui a l'énorme inconvénient de faire perdre énormément de lisibilité au code : on a trop vite fait de passer à coté de la déclaration ou de la décrémentation de j (respectivement de la déclaration ou de l'incrémentation de i)

    Evidemment, ce n'est qu'un avis personnel
    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

  7. #7
    Membre éprouvé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Points : 1 214
    Points
    1 214
    Par défaut
    Diantre !

    Toujours ce problème de unsigned char !
    Ta fonction m'affiche :
    FFFFFFE9 14 0 50 53 FFFFFFAC
    au lieu de
    E9 14 0 50 53 AC


    Mais ya du progrès, même si c'est pas spécialement plus court que le for

    EDIT: grâce à la FAQ, ceci marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::ostringstream oss;
    oss<<std::hex<<std::uppercase;
    std::copy(reinterpret_cast<const unsigned char*>(MBR.c_str()),
    reinterpret_cast<const unsigned char*>(MBR.c_str()) + MBR.length(),
    std::ostream_iterator<int>(oss, " "));
    std::cout<<oss.str();
    Un peu indigeste




    Citation Envoyé par koala01
    Au passage... je ne suis, personnellement, pas trop favorable à l'utilisation (de manière générale) de deux ou plusieurs variables dans les parenthèses d'une boucle for...
    M'en parle pas ! Regarde ce qu'on m'a appris à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i=0,j=12,v=-3;i>5 || j<12;i++,j--,v=j+2*i,std::cout << v){}
    Tout dans le for et rien dans les crochets !

    Enfin là c'est juste que j'avais pas envie d'un 'j' qui se balade tout seul

    The magic of Opera, La magie de l'Opera
    The mysteries of Space Opera, Les mystères de l'Opera Spatial
    Mr. Know-it-all, M. Je-Sais-Tout
    Prelude in C sharp minor, the most beautiful piano song and the best C sharp prelude ever, Prélude en do dièse mineur, le plus beau morceau de piano et le meilleur prélude au C#
    The Mesmerizing Saphir Division for Nerds, L'Hypnotisante Division Saphire pour les Nerds (HDSN)

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Un peu indigeste
    Mais, tellement plus satisfaisant

    Je reviens un peu en arrière :
    @Pierre Dolez : comme tu le dit, on tombe dans du C ! et bien que celà ne soit pas grave en soit pour moi, ça empêche notament la réutilisation de cette chaîne (alors qu'on aurait pu en c++ la balancer dans un ostream, pas nécessairement cout).
    Qu'entendez-vous par là ?
    Dernière modification par Invité ; 25/07/2010 à 12h21.

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

Discussions similaires

  1. transformer une chaîne de char en double (argv[])
    Par peuf23 dans le forum Débuter
    Réponses: 1
    Dernier message: 20/03/2008, 14h28
  2. Suppression dans une chaîne de char
    Par dj.motte dans le forum C
    Réponses: 25
    Dernier message: 13/01/2008, 07h24
  3. Réponses: 6
    Dernier message: 05/01/2008, 17h19
  4. [DotNET 1.1] Taille Max d'une chaîne d'un string
    Par trihanhcie dans le forum Général Dotnet
    Réponses: 5
    Dernier message: 23/10/2007, 15h59
  5. Taille d'affichage réel d'une chaîne de caractères
    Par SheikYerbouti dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 21/02/2007, 17h46

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