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. #21
    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 : 68
    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
    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?
    A partit du moment où le format 'réseau' est défini de façon indépendante de toute machine, il n'y a plus aucun problèmes. Il suffit de suivre la définition de chaque coté et ça roule.
    Pour la partie "data", je suppose que je peux l'ajouter en une fois et pas char après char?? Avec strcat?
    Si c'est une chaine, oui, à partir de tab + 3. Attention au 0 final. Sinon, memcpy() convient.
    Est ce que mon buffer peut rester un pointeur? La longueur des données à envoyer varie d'un envoi à un autre.
    Confusion... Un pointeur est un pointeur. Il a une taille fixe. Il pointe sur un bloc de données (que tu appelles buffer) qui a la taille qu'on lui a donné avec malloc().

    Oui, un bloc alloué est tout à fait indiqué. Penser à le libérer quand on en a plus besoin.

  2. #22
    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
    Si c'est une chaine, oui, à partir de tab + 3. Attention au 0 final. Sinon, memcpy() convient.
    ma variable "data" est toujours un chaîne de caractère. Elle contient pas exemple le nom d'un utilisateur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *data = "lydie";
    memcpy(buffer,data,strlen(data));
    Etant donné que strlen ne prend pas en compte '\0, je dois le rajouter ou pas besoin?

    au fait: merci de ton aide

  3. #23
    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 : 68
    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
    Si c'est une chaine, oui, à partir de tab + 3. Attention au 0 final. Sinon, memcpy() convient.
    ma variable "data" est toujours un chaîne de caractère. Elle contient pas exemple le nom d'un utilisateur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *data = "lydie";
    memcpy(buffer,data,strlen(data));
    Si j'ai bien compris, le T est en buffer[0] et le L en buffer[1] et[2]. Donc les données (V) commencent en buffer[3]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy(buffer + 3, data, strlen(data));
    Je pense qu'il faut éviter de multiplier les strlen() et stocker la longueur. Tu l'as forcément évaluée avant le malloc()...
    Etant donné que strlen ne prend pas en compte '\0, je dois le rajouter ou pas besoin?
    En principe, comme la taille est transmise (le T de TLV), pas besoin de marqueur de fin.

  4. #24
    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
    tab[0] = type;
    tab[1] = (longueur >> 8) & 0xFF; /* MSB */
    tab[2] = (longueur >> 0) & 0xFF; /* LSB */
    Apparemment ça il aime pas
    pour type, il le prend correctement si je déclare la variable comme étant un char et non un integer.

  5. #25
    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 : 68
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tab[0] = type;
    tab[1] = (longueur >> 8) & 0xFF; /* MSB */
    tab[2] = (longueur >> 0) & 0xFF; /* LSB */
    Apparemment ça il aime pas
    Qu'est-ce qui ne va pas ?
    pour type, il le prend correctement si je déclare la variable comme étant un char et non un integer.
    Ca ne devrait rien changer.

  6. #26
    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
    oups désolé je me suis trompé de balise

    Pour ce qu'il n'aime pas. c'est pas du côté C mais plutôt côté Java.

    Si je mets le type dans mon buffer en tant que variable de type interger, de l'autre côté il ne m'affiche pas ce qu'il faut. La manière dont je récupère les données c'est byte par byte pratiquement. Pour type, je lis un byte ensui te sachant que c'est un Integer, je le "transforme" en integer et là pafff c'est plus la bonne valeur.

    De même pour la longueur, celà devient 2 lettres après transcription.

  7. #27
    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 : 68
    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
    Pour ce qu'il n'aime pas. c'est pas du côté C mais plutôt côté Java.
    Pour les problèmes de Java, voir le forum dédié...

  8. #28
    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
    euh en fait j'ai vérifié la taille du buffer après ces lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tab[0] = type;
    tab[1] = (longueur >> 8) & 0xFF; /* MSB */
    tab[2] = (longueur >> 0) & 0xFF; /* LSB */
    et ben la taille est de zéro!!
    Par contre si je fais au moins:
    là la taille = 1. Je pense que mon pb est donc bien côté C

  9. #29
    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 : 68
    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
    euh en fait j'ai vérifié la taille du buffer après ces lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tab[0] = type;
    tab[1] = (longueur >> 8) & 0xFF; /* MSB */
    tab[2] = (longueur >> 0) & 0xFF; /* LSB */
    et ben la taille est de zéro!!
    Par contre si je fais au moins:
    là la taille = 1. Je pense que mon pb est donc bien côté C
    Je ne sais pas ce que tu dois mettre dans les champs. Je n'ai fait que t'indiquer comment le mettre.

    Essaye de donner un exemple réel.

  10. #30
    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
    type = 0
    longueur = 8 ( = 1 byte pour type, 2 pour length et 5 pour data)
    data = lydie

  11. #31
    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 : 68
    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
    type = 0
    longueur = 8 ( = 1 byte pour type, 2 pour length et 5 pour data)
    data = lydie
    Si le codage est 'binaire pur', on doit obtenir la séquence de bytes suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    00 00 08 'l' 'y' 'd' 'i' 'e'
    (j'ai un test en cours... je ne peut pas tester ton code pour le momemnt...)

  12. #32
    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
    maintenant je n'arrive pas à récupérer le packet envoyé au client.

    Le code du serveur Java:
    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
     
    ByteArrayOutputStream baos 	= new ByteArrayOutputStream();
    DataOutputStream output 	= new DataOutputStream(baos);
    // Write the authentication result
    if ( rp.getRequestType() == 2 ) {
       // Got an accept packet
       Output.writeByte(AuthenticationRequest.AUTH_SUCCESSFULL);
    } else if (rp.getRequestType() == 3 ) {
       // Got a reject packet		output.writeByte(AuthenticationRequest.AUTH_REJECTED);
    } else {
       // unknow answer. In that case, reject the authentication	output.writeByte(AuthenticationRequest.AUTH_REJECTED);
    }
     
     // write the length
    short packetLength = (short)(pendingRequest.getUsername().getBytes().length + 1);
    output.writeShort(packetLength);
     
    // Write the QIP profile
    output.write(pendingRequest.getUsername().getBytes());
    Du côté du client en C:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    numBytes = recvfrom(sockfd,buffer_out,OUT_MAXPACKET,0,NULL,0);
    fprintf(fp, "Number of received bytes: %d\n", numBytes);
    fprintf(fp, "Data received: %s - size: %d\n", buffer_out,strlen(buffer_out));
    Le nombre de bytes reçu = 9
    Mais strlen(buffer_out) = 1 et l'affichage %s ne retourne rien

  13. #33
    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 : 68
    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
    Mais strlen(buffer_out) = 1 et l'affichage %s ne retourne rien
    On a pas dit qu'il fallait sauter l'entête ?
    strlen(buffer_out + 3)

  14. #34
    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
    Là je ne comprend pas: strlen retourne la longueur de la chaine pointée par buffer_out. Donc pkoi ajouter 3?? Ce buffer contient la réponse du serveur. D'ailleurs même en ajoutant 3, on n'arrive pas à 9

  15. #35
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par be_tnt
    Là je ne comprend pas: strlen retourne la longueur de la chaine pointée par buffer_out. Donc pkoi ajouter 3?? Ce buffer contient la réponse du serveur. D'ailleurs même en ajoutant 3, on n'arrive pas à 9
    Non, on n'ajoute pas trois à un résultat, on dit à strlen de commencer le calcul de la longueur à partir de la 4ème (puisqu'un tableau commence à 0) case...

    buffer_out + 3 -> &(buffer[3])

    Jc

  16. #36
    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
    Si le codage est 'binaire pur', on doit obtenir la séquence de bytes suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    00 00 08 'l' 'y' 'd' 'i' 'e'
    (j'ai un test en cours... je ne peut pas tester ton code pour le momemnt...)
    Est-ce que par hasard tu aurais eu 5 petites minutes pour jeter un oeil sur mon petit problème?

  17. #37
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par Skyrunner
    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
    ...
    hmm, terrain glissant.
    la taille des entiers int est très variable (2, 4, 8 octets) d'un système à l'autre...

  18. #38
    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 rigobert
    hmm, terrain glissant.
    la taille des entiers int est très variable (2, 4, 8 octets) d'un système à l'autre...
    D'ou ma phrase : Architecture Standard, mais on peut se demander qu'est ce qu'une architecture standard ???

  19. #39
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par Skyrunner
    D'ou ma phrase : Architecture Standard, mais on peut se demander qu'est ce qu'une architecture standard ???
    Tout à fait d'accord cette fois-ci.

    De plus, lorsqu'on développe par exemple sous API Win32 avec un SDK à jour, on est régulièrement confronté à la problématique 32/64 bits (la chose ayant été, il faut bien le dire, un peu bricolée par M$) pour les pointeurs et les entiers, et certains casts peuvent se révéler mortels si on n'y fait pas attention...

  20. #40
    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
    Ici je n'ai pas de pb avec win32 puisque le dévelopement est sur système Unix. Maintenant y'a pas qqn qui ait une idée? Même une toute petite

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

Discussions similaires

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

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