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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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???
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  2. #2
    Expert confirmé
    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
    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 confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 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 confirmé
    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
    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 éclairé
    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
    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;
    }
    ???
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    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...
    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.

  7. #7
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 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 éclairé
    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
    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
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    Je soupçonne que cela ne devrait pas être portable à cause des problèmes d'endianess.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    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 éclairé
    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
    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?
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    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 éclairé
    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
    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...
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  14. #14
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    2 's'.
    Au pire, cherche little-endian et big-endian
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    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 éclairé
    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
    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
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

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