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 :

Convertion "short->char" un peu particuliere


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut Convertion "short->char" un peu particuliere
    Bonjour,

    Voila, j'ai un short dans le lequel je stocke deux caractères par exemple "a" et "z". ma variable short contient donc la concaténation des deux codes héxadécimaux des deux caractères, à savoir : "0x7A61" (7A pur "z" et 61 pour "a"). Ensuite j'aimerais pouvoir recuperer ces deux caractères et les mettres soit chacun dans une variable de type char, soit dans une chaine de deux caractères... Cela est-il possible...?

    Merci d'avance

  2. #2
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int MyInt = 0x7A61;
    char * MyChar = (char *) &MyInt;
    Toto = MyChar[0];  // 0x61;
    Toto = MyChar[1];  // 0x7A;

  3. #3
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 888
    Par défaut
    Citation Envoyé par 10_GOTO_10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int MyInt = 0x7A61;
    char * MyChar = (char *) &MyInt;
    Toto = MyChar[0];  // 0x61;
    Toto = MyChar[1];  // 0x7A;
    Méthode interessante, mais moins optimisée que le décalage, et le ET binaire, qui sont des opérations basiques du CPU; Je crois Ca reste à voir...

  4. #4
    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 10_GOTO_10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int MyInt = 0x7A61;
    char * MyChar = (char *) &MyInt;
    Toto = MyChar[0];  // 0x61;
    Toto = MyChar[1];  // 0x7A;
    Pas portable.

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    Emmanuel Delahaye, je ne comprend pas trop ce que font exactement ces deux lignes de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sa[0] = (x >> 8) & 0xFF;    //surtout le (x>>8)
    sb[0] = x & 0xFF;
    et KiLVaiDeN la méthode que tu m'a expliquée est la même que celle de Emmanuel Delahaye...? si non je ne la comprend pas trop..

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Par défaut
    la premiere ligne effectue un decalage bit à bit (<< vers la gauche | >> vers la droite) et apres il masque l'octet que l'on veut recuperer pour etre sur que l'on a bien cet octet et seulement lui .

    La deuxieme ligne est pouur l'octet de de poids faible un masquage suffit pour isoler l'octet de poids faible

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Par défaut
    c vrai que des notions comme le decalage et le masquage ne sont pas toujours present dans les cours de langage C

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    Je vous remercie c'est beaucoup plus clair.

  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 cout
    Emmanuel Delahaye, je ne comprend pas trop ce que font exactement ces deux lignes de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sa[0] = (x >> 8) & 0xFF;
    sb[0] = x & 0xFF;
    • >> est l'opérateur binaire de décalage à droite.
    • Le 8 signifie décalage de 8 bits.
    • & est l'opérateur binaire ET (AND)
    • 0xFF est un masque de 8 bits à 1 (bits 7 à 0)
    • VAR & 0xFF signifie que les bits 0 à 7 de VAR seront laissés intacts et que le bits > 7 seront forcés à 0.

  10. #10
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 888
    Par défaut
    Salut,

    Tu peux très facilement réussir à faire ce que tu veux, en faisant un simple décalage pour récupérer 7A, et un ET binaire avec un masque pour récupérer 61.

    Comprends-tu ce que je veux dire, où tu veux une explication plus approfondie ?

    A+

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Par défaut
    tu fais un masque (genre 0x00FF) pour obtenir que l'octet de poids faible et un decalage pour obtenir l'octet de poids fort

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Par défaut
    sinon le plus simple et le plus intuitif (je pense) c'est de mettre tes caractères dans une chaines de caracteres ?! non ?

  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 cout
    Voila, j'ai un short dans le lequel je stocke deux caractères par exemple "a" et "z". ma variable short contient donc la concaténation des deux codes héxadécimaux des deux caractères, à savoir : "0x7A61" (7A pur "z" et 61 pour "a"). Ensuite j'aimerais pouvoir recuperer ces deux caractères et les mettres soit chacun dans une variable de type char, soit dans une chaine de deux caractères... Cela est-il possible...?
    Oui ! Voici une réponse indirecte. Je te laisse extrapoler...
    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
     
    #include <stdio.h>
     
    int main (void)
    {
       short x = 0x7A61;
       char sa[2];
       char sb[2];
     
       sa[0] = (x >> 8) & 0xFF;
       sa[1] = 0;
     
       sb[0] = x & 0xFF;
       sb[1] = 0;
     
       printf ("%s %s\n", sa, sb);
     
       return 0;
    }

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

Discussions similaires

  1. Union entre short et char
    Par gilv57 dans le forum C++
    Réponses: 1
    Dernier message: 02/01/2007, 11h00
  2. [T-SQL]convert champ binaire en char
    Par arona dans le forum Sybase
    Réponses: 5
    Dernier message: 31/07/2006, 12h57
  3. UPDATE en ajoutant un 0 sur un champ de type "char"
    Par doum2 dans le forum Requêtes
    Réponses: 1
    Dernier message: 08/03/2006, 14h22

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