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 fichier .bin


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 147
    Points : 72
    Points
    72
    Par défaut Lecture fichier .bin
    Bonjour,

    J'ai à disposition un fichier .bin avec des bytes de données stockés en binaire. Mon fichier resseble donc à (...)1010101010100011(...).

    J'ai lu le contenu de ce fichier et stocké le tout dans un buffer. Jusqu'ici tout va bien.

    Le problème c'est que chaque 1 ou 0 est stocké dans le buffer comme un byte.
    Il me faudrait donc maintenant pouvoir extraire les bytes du fichier original depuis le buffer pour les mettre dans une variable char par exemple.

    Etant débutant, je tourne un peu en rond là.
    J'avais débuté avec ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    uint8 * psend  = (uint8*) malloc (sizeof(uint8)*8);;
    memcpy(psend,pu8Buffer + i, 8);
    i += 8;
    Mais il faut ensuite que je "compresse" la variable psend en un byte.

    Merci d'avance.

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    en s'inspirant de cette faq et de celle-là, et en utilisant un bitset, on peut parvenir à ce type de solution:

    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
    32
    33
    34
    35
    36
    37
    #include <bitset>
    #include <fstream>
    #include <vector>
    #include <iostream>
     
    using namespace std;
     
    const int BIT_SET_SIZE = 8;
    typedef bitset<BIT_SET_SIZE> Bs;
     
    long get_file_size( ifstream & in_file )
    {
        long pos = (long) in_file.tellg();
        in_file.seekg( 0 , ios_base::end );
        long size = (long) in_file.tellg() ;
        in_file.seekg( pos,  ios_base::beg ) ;
        return size ;
    }
     
    int main(int argc, char* argv[])
    {
        ifstream bin_file( "F:/dev/Tests/Test1/test.bin" );
        if ( !bin_file ) 
            return -1;
     
        long file_size = get_file_size( bin_file );
        char * buffer_in = new char[ file_size ];
        bin_file.read( buffer_in, file_size );
        vector< Bs > v;
        for ( long i = 0; i < file_size; ++i ) 
            v.push_back( Bs( (int)  buffer_in[i] ) );
     
        delete [] buffer_in;
     
        cin.get();
        return 0;
    }
    J'ai utilisé des bitset de 8 bits, mais c'est un choix totalement arbitraire, et ce ne sera peut-être pas le bon choix pour toi selon ton contexte.
    Pour accéder aux bits, au 4eme bit du 2eme bitset par exemple: v[2][4]

    Exemple pour afficher le résultat de la lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for ( vector< Bs >::const_iterator itv = v.begin(); itv != v.end(); ++itv )
    {
        for ( int i = 0; i < BIT_SET_SIZE ; ++i )
            /* cout << ( (*itv)[i] ) ? '1' : '0'; */ // marche aussi mais c'est un peu hard core je trouve ^_^
            if ( (*itv)[i] )
                cout << '1';
            else
                cout << '0';
        cout << endl;
    }
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

Discussions similaires

  1. Lecture fichier .bin
    Par marc-alex dans le forum Fortran
    Réponses: 9
    Dernier message: 16/03/2009, 11h14
  2. lecture d'un fichier.bin + affichage du contenu
    Par mitchness dans le forum C
    Réponses: 1
    Dernier message: 26/12/2007, 18h07
  3. lecture de fichier .bin
    Par dufoindufoin dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 23/09/2006, 13h15
  4. lecture fichier .bin ?
    Par touki79 dans le forum Delphi
    Réponses: 2
    Dernier message: 01/06/2006, 15h38
  5. Lecture d'un fichier .bin
    Par nanas dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 06/05/2005, 11h02

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