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 u_short en const char *


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2010
    Messages : 26
    Points : 35
    Points
    35
    Par défaut Conversion u_short en const char *
    Bonsoir à tous !

    Voila, je souhaite effectuer une conversion entre une variable de type u_short et une variable de type const char*.
    Avant j'aurais une petite question à poser pour que je puisse bien comprendre le cast.
    Dans la FAQ C++, il parle de différents types de famille, j'avoue avoir mal compris. Pour moi, un int est une famille, un char est une famille, un long est une famille, etc..., et donc j'ai du mal à comprendre la différence entre static_cast et reinterpret_cast.
    Ai-je mal compris ?

    Pour la conversion, entre un u_short et un const char*, je bloque totalement, et je ne comprend pas pourquoi je n'y arrive pas. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const char *c = NULL;
    c = reinterpret_cast<const char*>(eh->eth_type);
    Le compilateur me dit rien, et lorsque j'arrive à cette ligne, mon programme plante. J'avais eu l'idée de convertir la variable eh->eth_type en const unsigned char*, et ensuite lorsque je la reconvertie en const char*, cela fait bugger mon programme, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const char *c = NULL;
    const unsigned char *h = NULL;
    h=reinterpret_cast<const u_char*>(eh->eth_type);
    c=reinterpret_cast<const char*>(h);
    J'avoue avoir besoin d'un peu d'explications sur certain point.

    Je vous remercie par avance de votre aide.

    Cordialement,
    vegnagun

  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Oo
    Pourquoi veux-tu dire à ton programme «le unsigned short int, en fait, c'est un pointeur sur un char que je modifie pas (constant)» ?
    Pour que cela est un sens il faut que ton unsigned short int soit déjà plus ou moins un pointeur vers un char [const]

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2010
    Messages : 26
    Points : 35
    Points
    35
    Par défaut
    Je convertir mon u_short en const char * pour ajouter ces données dans une chaine de caractère pour qu'ensuite je puisse les afficher.
    En fait, j'ai plusieurs variable de type u_short qui sont dans une structure (eh), et je souhaite les stocker dans la variable char*.

  4. #4
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Ton char * est une chaîne de caractère ? Si oui, pourquoi ne pas utiliser std::string ?
    Si ton u_short contient le code acsii, tu peux faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << char(ton_u_short) << std::endl;
    Si tu veux avoir la valeur de ton u_short dans un std::string, tu peux utiliser cette fonction
    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
    #include <string>
    #include <sstream>
     
    /**
     * Convert into a string @param in using std::ostringstream
     * @return the std::string
     */
    template <class T>
    std::string to_string(T in)
    {
    	// Declare a stream
    	std::ostringstream out;
    	// Fill the stream
    	out << in;
    	// Output the stream in string
    	return (out.str());
    }

  5. #5
    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
    Salut,
    Les opérateurs de transtypage tels que présentés par l'entrée de la F.A.Q. que tu cite, ne servent pas à transformer des données depuis ou vers des chaînes de caractères.
    Comme le dit Ehonn, pour cela il faut passer par un flux de chaînes de caractères.
    Cf F.A.Q. Comment convertir un nombre en une string ?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2010
    Messages : 26
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    Ton char * est une chaîne de caractère ? Si oui, pourquoi ne pas utiliser std::string ?
    J'y avais penser, mais je ne voulais pas utiliser de class pour cette opération.
    Citation Envoyé par 3dArchi
    Salut,
    Les opérateurs de transtypage tels que présentés par l'entrée de la F.A.Q. que tu cite, ne servent pas à transformer des données depuis ou vers des chaînes de caractères.
    Comme le dit Ehonn, pour cela il faut passer par un flux de chaînes de caractères.
    Cf F.A.Q. Comment convertir un nombre en une string ?
    La structure est remplie, ces valeurs sont sous forme d'entier, j'ai juste à utiliser une fonction qui se nomme ntohs situé dans le fichier WinSock2.h, cette fonction me permet de convertir les octects pour les utilisateurs.
    Donc, je suis obliger d'utiliser la class std::string pour utiliser les chaines de caractères ?
    Car, si par exemple, les valeurs situé dans la structure eh est comme ceci : 27, la chaine de caractère contiendra 27.

  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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par vegnagun Voir le message
    La structure est remplie, ces valeurs sont sous forme d'entier, j'ai juste à utiliser une fonction qui se nomme ntohs situé dans le fichier WinSock2.h, cette fonction me permet de convertir les octects pour les utilisateurs.
    En fait ntohs( et ses copines ntohl, htons et htonl) sert à transformer l'endianess d'un short depuis le réseau vers la machine locale (network to host short). La convention (enfin la norme IP) étant sur réseau Big Endian. Ensuite, sur ton poste, ben ça dépend de ton poste

    Citation Envoyé par vegnagun Voir le message
    Donc, je suis obliger d'utiliser la class std::string pour utiliser les chaines de caractères ?
    En C++, oui.

    Citation Envoyé par vegnagun Voir le message
    Car, si par exemple, les valeurs situé dans la structure eh est comme ceci : 27, la chaine de caractère contiendra 27.
    pas compris.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2010
    Messages : 26
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    En C++, oui.
    Dommage, j'aurais espérer ne pas utiliser la class string.

    Citation Envoyé par 3DArchi Voir le message
    pas compris.
    Je voulais simplement effectuer l'opération suivante :
    Lorsque ma structure eh est remplie, donc chaque variable possède une valeur, je voulais simplement récupérer cette valeur et l'ajouter dans mon const char*

    EDIT : Je met le sujet en résolu.

    Je vous remercie à vous deux de votre aide.
    Pour résoudre mon problème, j'ai donc du passer par la class std::string

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

Discussions similaires

  1. conversion CString to const char* !
    Par ABAM3194 dans le forum MFC
    Réponses: 2
    Dernier message: 28/10/2014, 09h33
  2. Réponses: 4
    Dernier message: 28/01/2010, 11h28
  3. Réponses: 7
    Dernier message: 16/02/2008, 07h30
  4. conversion AnsiString en const char*
    Par Mangacker dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/05/2007, 18h43
  5. Conversion CString en const char*
    Par LRobi dans le forum MFC
    Réponses: 8
    Dernier message: 19/07/2005, 12h12

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