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 :

lecture dans un buffer binaire


Sujet :

C++

  1. #1
    Membre �prouv�
    Inscrit en
    Mai 2007
    Messages
    157
    D�tails du profil
    Informations personnelles :
    �ge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par d�faut lecture dans un buffer binaire
    Bonjour,

    je cherche a lire une partie d'un fichier binaire (qui contient des trames) afin de la placer (la trame lue) dans un buffer sur lequel j'appliquerai ult�rieurement des formatages...

    Comment declare ton un conteneur de ce type? puis-je passer par un stream et apres en extraire des partie??

    Merci de votre aide.

    note: Pour le moment je me contente de venir me placer en debut de trame, et de lire chaque element un a un ou au maximum 32 bits d'un coup pour en extraire chaque partie apres. Le but de cette manip est donc de charger en memoire la trame entiere, et d'acceder aux differentes parties par l'intermediaire de getters. La trame n'est recharg�e que si l'utilisateur veut explorer une autre trame.

  2. #2
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 124
    Par d�faut
    pour la fin tu utilises un retour chariot?

  3. #3
    Membre �prouv�
    Inscrit en
    Mai 2007
    Messages
    157
    D�tails du profil
    Informations personnelles :
    �ge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par d�faut
    Non, en fait le fichier source est totalement en binaire, certaines parties sont de taille fixe, d'autre il faut lire la taille de la string avant de pouvoir l'extraire....

    Je cherche donc a lire les parties de taille fixe d'une traite. La seule chose sure est que la taille minimal d'un bloc est 8 bits sachant que certaines parties doivent s'interpr�ter sur 4 bits.

    Est-ce un peu plus clair?

  4. #4
    Membre �prouv�
    Inscrit en
    Mai 2007
    Messages
    157
    D�tails du profil
    Informations personnelles :
    �ge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par d�faut
    Quel est le conteneur a declarer pour pouvoir lire dans un fichier binaire un nombre donn� de byte pour les interpr�ter apr�s?
    Pour l'instant j'ai quelquechose du genre qui evidement coince un peu...
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
            DWORD TypeId;
    		std::string mystring;
    		mystring.reserve(16);
    		is.read(reinterpret_cast<char*>(&mystring), 16);
    		from_string(mystring.substr(0,4),TypeId);
    		TypeId = htonl(TypeId);
    en utilisant le template de la faq suivant :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    template<typename T>
    bool from_string( const std::string & Str, T & Dest )
    {
        // créer un flux à partir de la chaîne donnée
        std::istringstream iss( Str );
        // tenter la conversion vers Dest
        return iss >> Dest != 0;
    }
    Il me semble qu'en passant par des istream ou quelquechose du genre.... ca permettrait qu'il n'y ait pas d'interpretation des donnees lors du stockage dans las string.
    Quelqu'un serait a meme de changer l'exemple pour remplacer la string par un istream?

  5. #5
    Membre �prouv�
    Inscrit en
    Mai 2007
    Messages
    157
    D�tails du profil
    Informations personnelles :
    �ge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par d�faut
    Je viens de trouver une possibilit� pour lire un groupe de byte et d'extraire apres les parties qui m'int�ressent. Voici le code
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DWORD getVersionInformation (std::istream& is)
    {
    		DWORD TypeId;
    		char tab[16];
    		is.read(reinterpret_cast<char*>(&tab), 16*sizeof( char));
    		TypeId = tab[0];
    		TypeId = TypeId <<8;
    		TypeId = TypeId + tab[1];
    		TypeId = TypeId <<8;
    		TypeId = TypeId + tab[2];
    		TypeId = TypeId <<8;
    		TypeId = TypeId + tab[3];
    return TypeId;
    }
    Y a t'il une facon plus luxieuse de faire ceci? j'ai mis ceci dans une fonction pour l'exemple, mais dans mon code, j'ai un conteneur qui sera un char[MAX_SIZE], dans lequel mes getter prendront en interpretant la partie desir�e.

    Une id�e d'am�lioration ? Car c'est un peu brut comme code....

  6. #6
    Membre �m�rite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par d�faut
    Y a t'il une facon plus luxieuse de faire ceci?
    Non c'est � peu pr�t la fa�on standard de faire, sauf qu'on utilisera un buffer d'unsigned char plut�t que char pour manipuler les octets. Aussi, attention, il y a une erreur sur la ligne suivante
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    is.read(reinterpret_cast<char*>(&tab), 16*sizeof( char));
    le '&' est en trop, il faut passer le buffer directement.

    Une autre fa�on de faire est de se passer de buffer en lisant les octets 1 � 1 avec is.get().

  7. #7
    Membre �m�rite Avatar de valefor
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    711
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 711
    Par d�faut
    Tu as aussi la possibilit� de faire :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DWORD getVersionInformation (std::istream& is)
    {
      union {
        DWORD _raw;
        char  _tab[sizeof(DWORD)];
      } id;
      is.read(id._tab, sizeof(id._tab));
      return id._raw;
    }
    Aux probl�mes d'endianess pr�s.

    Plus g�n�ralement tu peux directement tout mettre dans une structure qui se remplira automatiquement en surchargeant l'operteur >> par exemple.

    Par exemple :
    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
     
    struct Trame
    {
      DWORD _id;
      DWORD _foo;
      DWORD _bar;
      unsigned char _data[48];
     
      friend istream & operator >> (istream & is, Trame &trame) ;
    };
    istream operator >> (istream & is , Trame &trame)
    {
      is.read(reinterpret_cast<char *>(&trame), sizeof(trame)); 
      return is;
    }
     
     
    main
    {
      ...
      Trame trame;
      is >> trame;
      ...
    }
    [EDIT]Modif de l'exemple pour montrer qu'on peut lire des trames avec des champs de taille quelconque (mais attention aux alignements et aux endiens )[/EDIT]

  8. #8
    Membre �prouv�
    Inscrit en
    Mai 2007
    Messages
    157
    D�tails du profil
    Informations personnelles :
    �ge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par d�faut
    Merci valefor, mais ce que je cherche a faire est bien de r�cup�rer plus que 16 bits (comme 48 bytes d'un coup par exemple).
    Il ne me reste qu'a changer le template definit dans la FAQ pour indiquer le nombre de bits a lire..

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 5
    Dernier message: 15/06/2012, 15h00
  2. [D�butant] C# sous Win8, lecture dans un fichier binaire en asynchrone
    Par yupa dans le forum C#
    R�ponses: 2
    Dernier message: 14/06/2012, 14h35
  3. Lecture dans un fichier binaire
    Par crashtib dans le forum C
    R�ponses: 3
    Dernier message: 28/05/2009, 15h13
  4. Des int dans un buffer binaire
    Par Colbix dans le forum C++
    R�ponses: 16
    Dernier message: 30/03/2009, 14h42

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