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

Réseau C Discussion :

Convertir int en chaîne de caractère


Sujet :

Réseau C

  1. #1
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut Convertir int en chaîne de caractère
    Voilà, j'écris dans un buffer un élément de type int. J'utilise pour cela strcat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcat(buffer,strlen(adminNameIn)+ATTRIBUTE_HEADER_SIZE);
    La partie "strlen(adminNameIn)+ATTRIBUTE_HEADER_SIZE" doit être converti en chaîne de caractère. Si j'utilise (char), je risque de perdre de l'info. Est-ce que (char *) est possible et correct?

    Je sais que ce calcul n'exédera pas 33 characters.

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut Re: Convertir int en chaîne de caractère
    Citation Envoyé par be_tnt
    Voilà, j'écris dans un buffer un élément de type int. J'utilise pour cela strcat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcat(buffer,strlen(adminNameIn)+ATTRIBUTE_HEADER_SIZE);
    La partie "strlen(adminNameIn)+ATTRIBUTE_HEADER_SIZE" doit être converti en chaîne de caractère. Si j'utilise (char), je risque de perdre de l'info. Est-ce que (char *) est possible et correct?

    Je sais que ce calcul n'exédera pas 33 characters.
    Ca marche ton truc la !!!???

    Essaye ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sprintf(buffer, "%d", monentier);
    La réponse etait dans la
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    En fait le buffer sera utilisé pour envoyer des infos via un socket.
    Si j'utilises sprintf, je suppose que je peux mettre mes infos les unes à la suite des autres. Du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sprintf(buffer,"%d%d%s",type,taille,valeur);

  4. #4
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par be_tnt
    En fait le buffer sera utilisé pour envoyer des infos via un socket.
    Si j'utilises sprintf, je suppose que je peux mettre mes infos les unes à la suite des autres. Du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sprintf(buffer,"%d%d%s",type,taille,valeur);
    Oui et tu peux meme mettre des espaces comme ca de l'autre cote c'est facile pour faire un sscanf

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sscanf(buffer, "%d %d %s", &type, &taille, valeur);
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  5. #5
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    de l'autre côté, c'est du java. Donc pas de sscanf.

  6. #6
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    que pensez vous de:
    avec type = int et buffer = char *??

  7. #7
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par be_tnt
    que pensez vous de:
    avec type = int et buffer = char *??
    itoa n'est pas standard.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  8. #8
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    Alors ça marche bien avec sprintf sauf que je voudrais être sûre que: type soit sur 1 byte, taille 2 bytes. Comment est-ce que je peux faire ça?

  9. #9
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par be_tnt
    Alors ça marche bien avec sprintf sauf que je voudrais être sûre que: type soit sur 1 byte, taille 2 bytes. Comment est-ce que je peux faire ça?
    A toi de choisir tes types selon la taille que tu veux qu'ils aient.

    Arcitecture standard

    char = 1 octet
    short = 2 octets
    int = 4 octets
    char tab[10] = 10 octets
    ...
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  10. #10
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    Bon ça a pas l'air de vouloir fonctionner. Voilà ce que j'ai fait:

    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
     
    #define ATTRIBUTE_HEADER_SIZE 3
     
    /*
     * Attribute type definition
    */
    #define USERNAME_ATTR '0'
    #define USERPWD_ATTR '1'
    #define USERIP_ATTR '2'
     
    int packetSize = strlen(adminNameIn) + strlen(adminPassword)+ strlen(hostAddress) + ATTRIBUTE_HEADER_SIZE*3;
       sprintf(buffer,"%c%hd%s%c%hd%s%c%hd%s",
               USERNAME_ATTR,
               strlen(adminNameIn)+ATTRIBUTE_HEADER_SIZE,
               adminNameIn,
               USERPWD_ATTR,
               strlen(adminPassword)+ATTRIBUTE_HEADER_SIZE,
               adminPassword,
               USERIP_ATTR,
               strlen(hostAddress)+ATTRIBUTE_HEADER_SIZE,
               hostAddress);
    La taille du buffer et packetSize diffère de 2.

  11. #11
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    A vue de nez sans lire tout, je dirai qu'il te manque les 2 \0 de tes 2 chaines de caracteres.

    Si ta chaine vaut "bonjour" strlen te donnera 7, bien qu'elle fasse 8 octets
    'b', 'o', 'n', 'j', 'o', 'u', 'r', '\0'
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  12. #12
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    Donc si je te suis, le sprintf garde le '\0'.

  13. #13
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Octobre 2005
    Messages : 141
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par be_tnt
    Donc si je te suis, le sprintf garde le '\0'.
    Oui

  14. #14
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    ben ça marche toujours pas. Mon serveur en Java ne décrypte pas correctement. A mon avis, j'ai un petit problème niveau formattage des données.

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par be_tnt
    ben ça marche toujours pas. Mon serveur en Java ne décrypte pas correctement. A mon avis, j'ai un petit problème niveau formattage des données.
    Ben oui...

    Explique quel format de données tu veux (texte, binaire, séparateurs...)
    .
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    oki alors voilà le serveur java s'attend à récupérer :
    sur 1 byte: le type de donnée -> un integer
    sur 2 bytes: la longueur de l'ensemble type + length + value -> un short
    sur x bytes: une chaîne de caractère

    Pour le moment même le premier byte n'est pas reconnu correctement

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par be_tnt
    oki alors voilà le serveur java s'attend à récupérer :
    sur 1 byte: le type de donnée -> un integer
    sur 2 bytes: la longueur de l'ensemble type + length + value -> un short
    sur x bytes: une chaîne de caractère

    Pour le moment même le premier byte n'est pas reconnu correctement
    Ah, un bon vieux format TLV...

    Alors il faut définir un tableau de unsigned char et placer les données dedans une par une.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       unsigned char tab[TAILLE];
     
       tab[0] = type;
       tab[1] = (longueur >> 8) & 0xFF; /* MSB */
       tab[2] = (longueur >> 0) & 0xFF; /* LSB */
       tab[3] = data;
    <...>
       tab[TAILE-1] = data;
    Evidemment, tu peux utiliser l'allocation dynamique, memcpy() etc.

    J'ai supposé un codage du mot de 16-bit avec MSB en tête car c'est la norme réseau.
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    et oui un bon vieux TLV

    au fait j'ai résolu mon problème qui apparemment venait du côté java. Celui-ci s'attendait à recevoir un int et en fait il recevait un char. En le modifiant ça marche déjà beaucoup mieux. Maintenant ce que tu as écris m'intéresse. En fait du côté C, j'ai un buffer définit comme étant char *. Je fais un malloc pour réserver la mémoire et j'écris mes éléments un à un en utilisant sprintf. Est ce correct? :

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par be_tnt
    Maintenant ce que tu as écris m'intéresse. En fait du côté C, j'ai un buffer définit comme étant char *. Je fais un malloc pour réserver la mémoire et j'écris mes éléments un à un en utilisant sprintf. Est ce correct? :
    Pour une valeur numérique, non. sprintf() construit des chaines de caractères, pas des champs binaires de taille fixe...
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par be_tnt
    Maintenant ce que tu as écris m'intéresse. En fait du côté C, j'ai un buffer définit comme étant char *. Je fais un malloc pour réserver la mémoire et j'écris mes éléments un à un en utilisant sprintf. Est ce correct? :
    Pour une valeur numérique, non. sprintf() construit des chaines de caractères, pas des champs binaires de taille fixe...
    Ca devient de plus en plus intéressant Cela voudrait dire que du côté Java je ne devrais pas avoir de pb pour récupérer mon int?

    Pour la partie "data", je suppose que je peux l'ajouter en une fois et pas char après char?? Avec strcat?

    Est ce que mon buffer peut rester un pointeur? La longueur des données à envoyer varie d'un envoi à un autre.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 17/02/2007, 17h43
  2. Réponses: 4
    Dernier message: 22/12/2006, 15h10
  3. Convertir une chaîne de caractères
    Par PedroBD dans le forum Langage
    Réponses: 3
    Dernier message: 13/11/2006, 17h25
  4. Réponses: 3
    Dernier message: 09/05/2006, 14h35

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