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

MFC Discussion :

conversion d'une char* en int


Sujet :

MFC

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut conversion d'une char* en int
    Salut,

    J'ai une chaine de caractères (char*) et je vourait récuperer les 2 premiers caractères de celle-ci pour coder un int (2 octets)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char chaine[512];
    chaine[0] (1 octet) et chaine[1] (1 octet) ==> int (2 octects)
    Merci de m'aider

    PS: Il ne s'agit absolument pas d'une concversion de ce type : "atoi(chaine);"

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    sur 2 octets ça sera un short int et pas un int.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char chaine[512]; 
    short int n;
    memmove(&n,chaine,sizeof(n));

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Mais attention, ça ne marchera pas pareil d'un système à l'autre (problème d'endianness)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    peut-être que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    short int n = * (short int *) chaine;
    peut convenir.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par Médinoc
    Mais attention, ça ne marchera pas pareil d'un système à l'autre (problème d'endianness)...
    C'est le fait de compiler qui marche pas pareil d'un système à l'autre ou c'est l'exécution du programme qui n'est pcompatible avec tout les sytèmes ?

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Non, l'endianness est la disposition physique sur le support des octets de poids faibles et forts d'un nombre. Suivant les systèmes d'exploitation, il n'est pas identique. C'est pour celà que pour faire du portable il vaut mieux utiliser des fichiers textes plutôt que des fichiers de données brutes obtenus avec fwrite en C.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    Quelle serai la fonction la plus portative alors ? (Celle qui marche sur n'import quel système)


  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Deux méthodes:
    • Utiliser un fichier texte et les fonctions qui vont avec (fprintf(), strtol(), etc) pour convertir
    • Utiliser les fonctions de réseau htons() et ntohs() pour enregistrer tous les nombres au format "Réseau" (Network).
      Lors de la lecture ou l'enregistrement du nombre, on effectue la conversion entre formats "Réseau " et "hôte" (host) avec les fonctions htons() (host-to-network-short) et ntohs() (network-to-host-short) ou bien les fonctions htonl()/ntohl() (les mêmes avec des long).
      Ainsi, la seule chose à retenir, c'est que les nombres aient bien la même taille (si un long n'a pas la même taille sur les deux machines, ntohl() risque d'avoir quelques problèmes).
      Ainsi, pour lire ton nombre depuis la chaîne, tu ferais plutôt:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      short n = ntohs(* (short const *)chaine);
      (Et pour l'écrire, il y aura un htons() à insérer au bon endroit de ton code)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par farscape
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char chaine[512]; 
    short int n;
    memmove(&n,chaine,sizeof(n));
    Mais les short int ont la même taille sur tout les systèmes me semble t'il, donc méthode de farscape doit être portative, ou peut être je me trompe... :

    EDIT: Comment on fait dans l'autre sens quant je met "memmove(&buffer,n,2);" ça me met cette erreur : "invalid conversion from `short int' to `const void*' "

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    C'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memmove(buffer,&n,sizeof(short int));
    2 n'est absolument pas portable, la taille des short peut varier d'un système à l'autre
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  11. #11
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    pour moi, une manière portable à 100% serait ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    short int result = (chaine[0] << 6) | chaine[1];

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    C'est bon ça marche par contre c'est pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    short int result = (chaine[0] << 6) | chaine[1];
    //mais plutôt (erreur de frappe)
    short int result = (chaine[0] << 8) | chaine[1];
    et dans l'autre sens ça fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char chaine[16];   //déclaration de la chaine
    short int nb=12592;   //on atribut une valeur à nb
    chaine[1] = nb;   //premier caractère
    chaine[0] = (nb >> 8);   //second caractère
    Merci a vous tous

  13. #13
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    oui, milles excuses, meme pour etre plus évolutif et plus portable, au lieu de 8, tu devrais écrire sizeof(char)

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Avec sizeof(char), tu auras un décalage de 1 bit à tous les coups...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par nico-pyright(c)
    oui, milles excuses, meme pour etre plus évolutif et plus portable, au lieu de 8, tu devrais écrire sizeof(char)
    Citation Envoyé par Médinoc
    Avec sizeof(char), tu auras un décalage de 1 bit à tous les coups...
    En effet Médinoc a raison,
    j'ai trouver le truc (voir ci-dessou), ça marche avec les int, les short int et les long int (j'ai testé et apprové)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nombre = chaine[0] | (chaine[1] << 8);
    Par contre c'est dans l'ordre inverse (par rapport aux messages au dessus),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    octet chaine[0] -> 1er octet du int
    octet chaine[0] -> 2ème octet du int
    //c'est plus logique comme ça me semble t'il

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    En fait tu avais raison avant de dire ça :

    Citation Envoyé par nico-pyright(c)
    oui, milles excuses, meme pour etre plus évolutif et plus portable, au lieu de 8, tu devrais écrire sizeof(char)
    Le solution était bien celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nombre = (chaine[0] << 8) | chaine[1];
    Mais comme je l'ai dit au message précédent c'est plus logique dans ce sens la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nombre = chaine[0] | (chaine[1] << 8);

  17. #17
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    niveau logique, c'est toi qui voit ce que tu veux faire

    et il faut multiplier par sizeof(char) par 8 pour avoir le nombre de bit

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    C'est sur, mais ça revient au même d'écrire "sizeof(char)*8" que d'écrire "8", parce sizeof(char) sera TOUOURS égal a 1, je me trompe :

  19. #19
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    pour l'instant non ... mais que nous réserve l'avenir ?

    moi j'ai bien vu des integer ou des short qui changeaint de taille en fonction du compilo (watcom / turboC / VC++) (ok, aussi en fonction de sous dos et sous windows ...)

  20. #20
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    enfin c'etait aussi parce qu'on est passé de compilos 16 bits a 32 bits..

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

Discussions similaires

  1. Conversion d'un *(?) char vers int
    Par theclem35 dans le forum Débuter
    Réponses: 3
    Dernier message: 02/06/2011, 14h08
  2. Conversion d'un char en int
    Par [BkM-) dans le forum Débuter
    Réponses: 6
    Dernier message: 23/11/2007, 23h50
  3. [INGRES II] cast d'une char[] en int
    Par prem's dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 05/04/2007, 15h11
  4. [Conversion]Convertir un char[] en int
    Par ThanosT dans le forum Général Java
    Réponses: 10
    Dernier message: 11/11/2005, 12h23
  5. "Conversion" d'un char en int ou longueur
    Par Michaël dans le forum C
    Réponses: 6
    Dernier message: 15/08/2003, 11h40

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