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 :

manipulation d'une std::string


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut manipulation d'une std::string
    Bonjour,

    Voila, j'ai un petit problème avec la manipulation d'une std::string.
    J'ai une chaine std::string tcont1 qui contient des données codées en hexa (en tout 136 données en hexa).
    Je souhaiterai convertir ces données en binaire.
    Ainsi, la méthode auquelle j'ai pensé est de construire un tableau à partir de la chaine tcont1, et ensuite convertir chaque données du tableau en hexa.
    Mais j'ai plusieurs soucis.

    Tout d'abord : tcont1.length() me donne la taille 136 que j'attend, mais lorsque je souhaite construire un tableau de cette taille là , je n'obtiens qu'un tableau de 68 cases, je ne vois pas pourquoi.

    Ensuite, la méthode que j'ai dévellopée pour remplir le tableau à partir de tcont1 ne fonctionne pas et je ne vois pas d'ou vient l'erreur. Je vous la donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    char contenu1[tcont1.length()+1];
    for (int i=0; i<tcont1.length();i++){
    contenu1[i] = atoi(tcont1.substr(0,1).c_str());
    tcont1=(tcont1.substr(1));
     
    }
    il reste encore après à faire la conversion en binaire, mais j'aimerai déjà pouvoir résoudre ces problèmes.
    Si certains d'entres vous peuvent m'ouvrir les yeux!! c'est surement évident...
    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2009
    Messages : 110
    Points : 85
    Points
    85
    Par défaut
    Une première remarque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char contenu1[tcont1.length()+1];
    for (int i=0; i<tcont1.length();i++){
    contenu1[i] = atoi(tcont1.substr(0,1).c_str());
    la fonction atoi renvoi un int et pas un char.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    effectivement merci, j'ai corrigé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char contenu1[tcont1.length()+1];
    for (int i=0; i<tcont1.length();i++){
    contenu1[i] = tcont1.substr(0,1).c_str();
    tcont1=(tcont1.substr(1));
    Mais ça me donne :

    error: invalid conversion from `const char*' to `char'

    Il y a peut être plus simple pour convertir une string codée en hexa en une string en binaire mais je ne vois pas comment.

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    En fait, l'appel à c_str() renvoie un const char* que tu veux mettre dans un char.

    Tu dis que "tcont1.length()" te renvoi 136 ou 68? Est-ce que tu peux nous donner un exemple de ce que contient tcont1? J'arrive pas à trop me le représenter...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    tcont1 contient 94d849d5bb6f00000056b00900000002000000020000000226234fb4b4aff6ba38fbeeaf5de3fd3bdff99bdbcb9c9e6f143532e9000000000000000000000000c0000000

    tcont1.length() me renvoie 136.
    Mais char contenu1[tcont1.length()+1] me donne un tableau de 68 cases...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2009
    Messages : 110
    Points : 85
    Points
    85
    Par défaut
    essaye avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(char*,const char* format,...)
    .
    Cette fonction va stocker ton string (3éme arg), dans ton char* (1er arg) selon le format (2éme arg) que tu souhaites.

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    Je pense que l'explication du 136 - 68 vient du fait que ton string contient en fait 68 caractères hexadécimaux codés chacun sur un octet (par exemple C1 ou B5 tout ça en base 16). Après, p-e que quelqu'un peut nous donner plus d'explications là dessus parce que je ne suis pas totalement certain de ce que j'avance...

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Merci de vos réponses mais :
    sprintf(char*,const char* format,...)
    Je ne peux pas me servir de cette fonction,puisque je manipule des std::string; enfin il me semble?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2009
    Messages : 110
    Points : 85
    Points
    85
    Par défaut
    je crois que tu peux trouver ton bonheur ici

  10. #10
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    Tu devrais peut-être trouver ton bonheur de ce côté là : http://cpp.developpez.com/faq/cpp/?p...TRINGS_to_char

    Edit : J'ai pas été assez rapide ! Les deux liens devraient pouvoir t'aider je pense

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    merci à vous, je vais regarder vos liens.

  12. #12
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    Regarde aussi du côté de string::data() et de memcpy()

    Par exemple quelque chose du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    size_t size = tcont1.size() + 1;
    char contenu1[size];
     
    memcpy (contenu1, tcont1.data(), size);
    A tester par contre... je garantis pas

  13. #13
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Quelques précisions :
    Citation Envoyé par titou35 Voir le message
    Je souhaiterai convertir ces données en binaire.
    Je reformule : tu souhaites récupérer ces valeurs hexa dans un type entier : la faq est là pour toi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        std::istringstream iss( "1A" );
        // convertir en un int
        unsigned int nombre;
        iss >> std::hex>>nombre;
    Citation Envoyé par titou35 Voir le message
    Ainsi, la méthode auquelle j'ai pensé est de construire un tableau à partir de la chaine tcont1, et ensuite convertir chaque données du tableau en hexa.
    [...]
    Houlà. Très compliqué tout ça. Heureusement, la STL a pensé à toi :
    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
    #include <iostream>
    #include <string>
    #include <sstream>
     
    int main()
    {    
        // créer un flux à partir de la chaîne à convertir
        const std::string str("1A2b3c4d5e6f0001020304");
        std::string str_cur(str);
        while(str_cur.length()>1){
           std::istringstream iss(str_cur.substr(0,2));
           unsigned int nombre;
           iss >> std::hex>>nombre;
           std::cout<<nombre<<std::endl;
           str_cur = str_cur.substr(2);
        }
        return 0;
    }
    Certainement perfectible. Mais de grâce. Pas de sprintf, atoi et autre cochonnerie en C++

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     std::istringstream iss( "1A" );
        // convertir en un int
        unsigned int nombre;
        iss >> std::hex>>nombre;
    Ce code donne nombre = 26, or moi je souhaiterais obtenir nombre =00011010 (26 en binaire).
    dsl si je m'exprime mal

  15. #15
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par titou35 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     std::istringstream iss( "1A" );
        // convertir en un int
        unsigned int nombre;
        iss >> std::hex>>nombre;
    Ce code donne nombre = 26, or moi je souhaiterais obtenir nombre =00011010 (26 en binaire).
    dsl si je m'exprime mal
    Salut,
    Qu'entends-tu par nombre binaire ?
    Tu as le type char, short, int, long ou encore string. Mais binaire, je ne vois pas ?

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2009
    Messages : 110
    Points : 85
    Points
    85
    Par défaut
    Et c'est pour cette raison que je t'es conseillé de voir ici

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    A parir d'une chaine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string str("1A2b3c4d5e6f0001020304");
    je souhaiterais obtenir une chaine

    "0001101000101011..."

    Je ne sais pas si c'est plus clair..

  18. #18
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    Comme l'a suggéré 3DArchi, la meilleure manière est de passer ton string en int et d'utiliser la méthode donnée par mehdi_me85 pour mettre dans un string l'entier dans sa représentation binaire.

    Du genre :

    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
     
    const std::string str("1A2b3c4d5e6f0001020304");
    std::string str_cur(str);
    std::string str_bin("");
     
    while(str_cur.length()>1){
           std::istringstream iss(str_cur.substr(0,2));
           unsigned int nombre;
           iss >> std::hex>>nombre;
     
           std::bitset<8> b2( nombre );
     
           std::ostringstream oss;
           oss << b2;
           str_bin += oss.str()
     
           str_cur = str_cur.substr(2);
        }
     
    return str_bin; // 101100101110.....etc...etc...

  19. #19
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Avec l'entrée conseillée par mehdi, tu ne devrais plus avoir de problème, non ?

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    merci à tous les 3.
    Je ne voyais pas le lien entre vos réponses, maintenant c'est bon.

    Superbe forum!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. taille d'une std::string
    Par ZeNoob dans le forum SL & STL
    Réponses: 3
    Dernier message: 19/05/2012, 11h06
  2. Réponses: 2
    Dernier message: 14/06/2010, 15h21
  3. Convertir une std::string de utf8 vers cp850
    Par dj.motte dans le forum SL & STL
    Réponses: 7
    Dernier message: 30/10/2008, 22h15
  4. Parcours d'une std::string lettre à lettre
    Par MABB dans le forum SL & STL
    Réponses: 13
    Dernier message: 13/08/2008, 13h50
  5. [FAQ]Comment convertir une std::string en AnsiString ?
    Par Invité dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/11/2006, 18h08

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