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

  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 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    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+

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    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...

  5. #5
    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

  6. #6
    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;
    }

  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
    sinon le plus simple et le plus intuitif (je pense) c'est de mettre tes caractères dans une chaines de caracteres ?! non ?

  8. #8
    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.

  9. #9
    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..

  10. #10
    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

  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
    c vrai que des notions comme le decalage et le masquage ne sont pas toujours present dans les cours de langage C

  12. #12
    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.

  13. #13
    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
    Ce que disent Emmanuel et Kilvaiden est exactement la meme chose
    Kilvaiden tu l'explique avec des mots et Emmanuel te l'a dis en code.

  14. #14
    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.

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Selon ce que j'ai vu sur le forum jusqu'à présent, Emmanuel Delahaye répond toujours avec une solution pratique, portable et claire Tu peux être sûr que sa solution est bonne et testée ( je pense qu'il teste en direct les bouts de code qu'il fournit ) donc c'est lui qu'il faut écouter si tu as la chance qu'il réponde

    Moi je n'ai pas du tout autant d'experience que lui, tout ce que je fais c'est donner une piste car je n'ai pas de compilateur C sous le coude, et donner du code C dans ces conditions serait hasardeux et pourrait générer de nouvelles erreurs

    D'ailleurs en l'occurence, dans ma réponse, j'avais oublié le fait qu'après un décalage, il est quand même necessaire de faire un masque, car le "int" peut être plus grand que ce qu'on croit !

    A+

  16. #16
    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 KiLVaiDeN
    Selon ce que j'ai vu sur le forum jusqu'à présent, Emmanuel Delahaye répond toujours avec une solution pratique, portable et claire Tu peux être sûr que sa solution est bonne et testée ( je pense qu'il teste en direct les bouts de code qu'il fournit ) donc c'est lui qu'il faut écouter si tu as la chance qu'il réponde
    Merci, mais ma modestie légendaire est gravement endommagée...

    D'autre part, comme pour tout être humain, une erreur est toujours possible (je l'ai maintes fois prouvé). Donc, toujours vérifier ce qui est dit.

    B.A. BA de la bonne gestion : Diversifier ses sources : Une source unique n'est pas infaillible et d'autre part, elle peut se tarir.

+ 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