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 :

Représentation binaire d objets.


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Points : 109
    Points
    109
    Par défaut Représentation binaire d objets.
    Bonjour, je cherche à créer une fonction template qui renvoie un string contenant la représentation binaire d un objet.
    J'en suis arrivé à : (En commentaire une ancienne version qui engendrait des rotations)
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <string>
    using namespace std;
     
    template<class T> string binaryString(const T& O)
    {
      int size = sizeof(T);
     
      static const int sizeofuchar = sizeof(unsigned char); 
      static const unsigned char c = static_cast<unsigned char> (1); //Avant : c = char(128)
      const unsigned char* curpart = reinterpret_cast<const unsigned char*> (&O); 
     
      char cur = c;
      string ret = "";
     
      for(int i = 0; i<size ; i++)
        {
          for(int j=0; j<sizeofuchar*8; j++)
    	{
    	  ret=(cur&(*curpart) ? "1" :"0")+ret ; //Avant : ret+=(cur&(*curpart) ? "1" :"0"); 
    	  cur<<=1; //Avant cur>>=1;
    	}
          curpart++;
          ret=" "+ret; // Avant : ret+=" ";
        }
     
      return ret;
     
    }
    seulement, quand je teste cette fonction via :

    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
    #include "TPrintBinary.h"
    #include <string>
    #include <iostream>
    using namespace std;
     
    int main(){
     
    string S;
    const int SIZE = 10;
     
     cout << "*******************Entiers (int) ***********************"<<endl;
    int A[SIZE] = {1,2,4,8,16,32,64,128,256,512};
    for (int i=0; i<SIZE; i++){  
      cout<< binaryString(A[i]) ;
      cout<<" : " << A[i] << " : int " <<endl; 
     }
     
    }
    Une idée ?

    j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     00000000 00000000 00000000 00000001 : 1 : int 
     00000000 00000000 00000000 00000010 : 2 : int 
     00000000 00000000 00000000 00000100 : 4 : int 
     00000000 00000000 00000000 00001000 : 8 : int 
     00000000 00000000 00000000 00010000 : 16 : int 
     00000000 00000000 00000000 00100000 : 32 : int 
     00000000 00000000 00000000 01000000 : 64 : int 
     00000000 00000000 00000000 10000000 : 128 : int 
     00000000 00000000 00000000 00000000 : 256 : int 
     00000000 00000000 00000000 00000000 : 512 : int
    Une idée ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Points : 109
    Points
    109
    Par défaut
    J'ai trouvé...

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include <string>
    using namespace std;
     
    template<class T> string binaryString(const T& O)
    {
      int size = sizeof(T);
     
      static const int sizeofuchar = sizeof(unsigned char); 
      static const unsigned char c = static_cast<unsigned char> (1); 
      const unsigned char* curpart = reinterpret_cast<const unsigned char*> (&O); 
     
      char cur = c;
      string ret = "";
     
      for(int i = 0; i<size ; i++)
        {
          for(int j=0; j<sizeofuchar*8; j++)
    	{
    	  ret=(cur&(*curpart) ? "1" :"0")+ret ;  
    	  cur<<=1; 
    	}
          curpart++;
    ////////////////////////////////////////////////////////////////////////////////
          cur = c; //ligne oubliée dans le précédent code...////
    ////////////////////////////////////////////////////////////////////////////////
          ret=" "+ret; 
        }
     
      return ret;
     
    }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 49
    Points : 89
    Points
    89
    Par défaut
    Bonjour,

    Pour avoir rencontré le même problème, il faut d'abord savoir que le reinterpret_cast est dépendant de l'architecture de ta machine pour les types numériques (little et big indian, voir htons si tu veux faire du réseau).

    Je n'ai pas testé mais si cur est de type char, il ne se décalera jamais au delà d'un octet, ton erreur vient sûrement de là

    EDIT : en fait non, autant pour moi

    Sinon si tu cherche une solution plutôt fonctionnelle je me souviens avoir résolu ce problème avec std::string<unsigned char> et un itérateur dessus de façon plus concise.
    Au commencement Dieu a crée l'Homme, puis l'Homme a crée la machine, puis l'Homme a tué Dieu. Fou de rage, Dieu a envoyé à l'Homme l'Informatique pour le punir de son orgueil.


    Le libéralisme économique est une conjecture qui énonce que tout ensemble de classes tend à constituer un programme cohérent et stable.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Points : 109
    Points
    109
    Par défaut
    Merci de l'info, je me pencherai sur ta proposition plus tard, je suis passé a autre chose

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

Discussions similaires

  1. [Type Double] Représentation binaire?
    Par sekiryou dans le forum C++
    Réponses: 4
    Dernier message: 17/04/2008, 18h17
  2. [debutant] obtenir la représentation binaire d'un code ascii
    Par coco21 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 08/11/2007, 09h06
  3. Fichiers binaires et objets T
    Par vdumont dans le forum C++
    Réponses: 7
    Dernier message: 18/05/2006, 19h49
  4. représentation binaire-->entier
    Par felicity dans le forum C
    Réponses: 6
    Dernier message: 17/01/2006, 20h57
  5. CRITERIA - Représentation binaire d'un nombre décimal signé.
    Par RamDevTeam dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 10/08/2005, 14h56

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