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 :

Manipulation binaire -> Division de 24Bits en 3*8


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut Manipulation binaire -> Division de 24Bits en 3*8
    J'ai une variable qui resemble a sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned int Var24BTS = 0x10FF0A;
    Je voudrais la décomposer en trois variable de 8 bit, de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unsigned char Var1 = 0x10;
    unsigned char Var2 = 0xFF;
    unsigned char Var3 = 0x0A;
    Je sais que je doit manipuler les bits, j'ai tester sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        std::cout << "TVAR Var24BTS = " << (Var24BTS) << "\n";    
        std::cout << "V1 : Var24BTS >> 8*2 = " << (Var24BTS>>8*2) << "\n";
        std::cout << "V2 : Var24BTS << 8*1 >>> 8*2 = " << ((Var24BTS<<8*1)>>8*2) << "\n";
        std::cout << "V3 : Var24BTS << 8*2 >>> 8*2 = " << ((Var24BTS<<8*2)>>8*2) << "\n";
    Seulement sa ne marche pas du tout. Quelqu'un serais comment faire???

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      unsigned int Var24BTS = 0x10FF0A;
      unsigned char var1 = Var24BTS ;
      unsigned char var2 = Var24BTS >> 8;
      unsigned char var3 = Var24BTS >> 16;

  3. #3
    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
    Peut etre avec ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef union {
    	struct { unsigned a:8; unsigned b:8; unsigned c:8} Bidule;
    	unsigned x:24;
    }Truc;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Truc b; 
    b.x = 0x10FF0A;
    b.Bidule.a contient 0A
    b.Bidule.b contitent FF
    b.Bidule.c contient 10

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Skyrunner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef union { 
       struct { unsigned a:8; unsigned b:8; unsigned c:8} Bidule; 
       unsigned x:24; 
    }Truc;
    Cette solution dépend si le système est BigEndian ou LittleEndian

  5. #5
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    5 E:\Files\c++\BitaBit.cpp expected `;' before '}' token
    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 <iostream>
    #include <string>
     
    typedef union {
       struct { unsigned a:8; unsigned b:8; unsigned c:8} Bidule;
       unsigned x:24;
    }Truc;
     
    int main(int argc, char *argv[])
    {
    Truc b;
    b.x = 0x10FF0A; 
        std::cout << "TVAR Var24BTS = " << b.x << "\n";    
        std::cout << "V1 : " << b.a << "\n";
        std::cout << "V2 : " << b.b << "\n";
        std::cout << "V3 : " << b.c << "\n";
     
        return 0;
    }
    ???

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 578
    Points
    41 578
    Par défaut
    Les champs de bits sont très mauvais, car il n'y a aucun standard dessus. L'ordre dans lequel tu le récupéreras dépend du compilateur...

    La méthode de diogene est la meilleure pour cela (avec peut-être un case explicite en plus)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    unsigned int Var24BTS = 0x10FF0A;
      unsigned char var1 = (unsigned char)Var24BTS ;
      unsigned char var2 = (unsigned char)(Var24BTS >> 8);
      unsigned char var3 = (unsigned char)(Var24BTS >> 16);
    Cela a l'avantage de fonctionner même si tu changes par la suite le type de var1, var2, var3... Sinon, la méthode de Diogène suffit...

  7. #7
    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 JC_Master
    5 E:\Files\c++\BitaBit.cpp expected `;' before '}' token
    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 <iostream>
    #include <string>
     
    typedef union {
       struct { unsigned a:8; unsigned b:8; unsigned c:8} Bidule;
       unsigned x:24;
    }Truc;
     
    int main(int argc, char *argv[])
    {
    Truc b;
    b.x = 0x10FF0A; 
        std::cout << "TVAR Var24BTS = " << b.x << "\n";    
        std::cout << "V1 : " << b.a << "\n";
        std::cout << "V2 : " << b.b << "\n";
        std::cout << "V3 : " << b.c << "\n";
     
        return 0;
    }
    ???
    il manque un ; a la fin de unsgined c:8

  8. #8
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    A oui sa marche, mais la méthode de Médinoc est un peut plus simple ^^
    Sinon j'aurais appris deux nouveau mots c++ ^^ (Union et le

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Je soupçonne que cela ne devrait pas être portable à cause des problèmes d'endianess.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Inutile de définir des bitfields pour des multiples de 8 bits.
    Il suffit de considérer l'int (qui visiblement est stocké sur 32 bits sur ta machine) en un tableau de char.

    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
    int main()
    {
      long int Var24BTS = 0x10FF0A; 
      unsigned char * chPtr = reinterpret_cast<unsigned char*>(&Var24BTS);
      unsigned char var1,var2,var3;
     
    #ifdef BIGENDIAN
      var1 = chPtr[1];
      va2 = chPtr[2];
      var3 = chPtr[3];
     
    #else
      var1 = chPtr[2];
      var2 = chPtr[1];
      var3 = chPtr[0]
    #endif
    }
    EDIT: remplacé (Var24BTS) par (&Var24BTS)

  11. #11
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Citation Envoyé par Luc Hermitte
    Je soupçonne que cela ne devrait pas être portable à cause des problèmes d'endianess.
    Escuse mon ignorence mais c'est coi un "endianes" ?

    Citation Envoyé par VoidSeer
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
      unsigned char * chPtr = reinterpret_cast<unsigned char*>(Var24BTS);
    ...
    ...
    Aurais tu un tutoriel sur les fonctions templates de cast? Car je ne les conais pas et je n'ai rien trouver dans la faq/tutos?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Citation Envoyé par JC_Master
    Escuse mon ignorence mais c'est coi un "endianes" ?
    http://www.google.fr/search?hl=fr&q=...e+Google&meta=

    Citation Envoyé par JC_Master
    Aurais tu un tutoriel sur les fonctions templates de cast? Car je ne les conais pas et je n'ai rien trouver dans la faq/tutos?
    http://cpp.developpez.com/cours/cpp/

  13. #13
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Ok merci ^^
    Sinon les resultat google sont des message sur les forum sur des questions "A propos" des endianes, et non d'elles mêmes?(c'est un mot féminin ou masculin?)

    Edit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char * chPtr = reinterpret_cast<unsigned char*>(Var24BTS);
    Si j'utilise chPrt[I] avec 2>= I >=0 sa fait plenter mon aplic sdl, pas moyen de savoir ce que contien cette variable avec std::cerr car son utilisation(chPrt) fait plenter le code...

  14. #14
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    2 's'.
    Au pire, cherche little-endian et big-endian

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Citation Envoyé par JC_Master
    Sinon les resultat google sont des message sur les forum sur des questions "A propos" des endianes, et non d'elles mêmes?(c'est un mot féminin ou masculin?)
    Le premier lien de google avec la recherche que je t'ai fourni en donne une définition.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char * chPtr = reinterpret_cast<unsigned char*>(Var24BTS);
    Si j'utilise chPrt[I] avec 2>= I >=0 sa fait plenter mon aplic sdl, pas moyen de savoir ce que contien cette variable avec std::cerr car son utilisation(chPrt) fait plenter le code...
    Normal, y'a une erreur dans le code initial, c'est l'adresse de la variable qu'il faut considérer comme un pointeur sur le début d'un tableau, et non la valeur elle-même.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char * chPtr = reinterpret_cast<unsigned char*>(&Var24BTS)

  16. #16
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    A oui c'est vrai, merci, je vais tester sa ^^
    Sinon j'ai trouver une définition en francais, mais les résultats était en anglais, et je ne parle pas anglais

Discussions similaires

  1. Manipulation binaire (division)
    Par nahr_Elk dans le forum C
    Réponses: 4
    Dernier message: 20/05/2008, 18h44
  2. Manipulation binaire de fichiers
    Par Vladislav IV dans le forum Général Python
    Réponses: 1
    Dernier message: 04/08/2006, 11h33
  3. manipulation en binaire
    Par joecool2005 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/12/2005, 15h25
  4. Manipulation de données binaires
    Par Defre87 dans le forum Général Python
    Réponses: 3
    Dernier message: 28/09/2005, 16h16
  5. Manipulations binaires : savoir si un bit est "set"
    Par DiGiTAL_MiDWAY dans le forum Général Python
    Réponses: 2
    Dernier message: 18/09/2005, 16h42

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