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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent
    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
    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.

  2. #2
    Membre éclairé 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
    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? :

  3. #3
    Expert éminent
    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
    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...

  4. #4
    Membre éclairé 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
    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.

  5. #5
    Expert éminent
    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
    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.

  6. #6
    Membre éclairé 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
    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

  7. #7
    Expert éminent
    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
    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.

  8. #8
    Membre éclairé 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
    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.

  9. #9
    Expert éminent
    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
    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.

  10. #10
    Membre éclairé 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
    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.

  11. #11
    Expert éminent
    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
    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é...

  12. #12
    Membre éclairé 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
    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

  13. #13
    Expert éminent
    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
    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.

  14. #14
    Membre éclairé 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
    Par défaut
    type = 0
    longueur = 8 ( = 1 byte pour type, 2 pour length et 5 pour data)
    data = lydie

  15. #15
    Expert éminent
    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
    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...)

  16. #16
    Membre éclairé 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
    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. #17
    Membre éclairé 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
    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

  18. #18
    Expert éminent
    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
    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)

  19. #19
    Membre éclairé 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
    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

  20. #20
    Expert confirmé

    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
    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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