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 :

decompression partie de fichier binaire


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2015
    Messages : 35
    Points : 37
    Points
    37
    Par défaut decompression partie de fichier binaire
    Bonjour,

    J'ai un fichier binaire constitué d'un header de 11 octets suivi d'un bloc de donnéees compressé en gz qui fait une centaine de Ko
    Je veux charger le fichier, separer l'entete et decompresser le buffer de valeurs qui sont encodées sur un octet signé.
    Je dois recuperer une suite de int de 730 par 730 valeurs

    Etant debutant en C++ , pour l'instant je fais la chose suivante en m'inspirant de divers exemples :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <zlib.h>
    #include <vector>
     
    using std::ios;
    using std::cout;
    using std::endl;
    using std::string;
    using std::ifstream;
    using namespace std;
     
    int main()
    {
     
        std::string  filein= "Divers/modeles/1_-2_47.deg";
        std::string  fileout="Divers/modeles/1_-2_47out.deg";
        ifstream fluxentree(filein.c_str(),ios::in | ios::binary);
        ofstream fluxsortie(fileout.c_str(),ios::out | ios::binary);
     
        const int N=11 ;                                          //nombre d'octets à supprimer en-tête
        if (fluxentree.fail()) { cout << "erreur fichier "<<endl; return 1;}
        fluxentree.seekg(N+1, ios::beg);                          //décalage du pointeur de lecture
        fluxsortie << fluxentree.rdbuf();                        //ici la ligne de copie vers la sortie rdbuf retourne un pointeur 
     
     
     
        gzFile inFileZ = gzopen(fileout.c_str(), "rb");
        if (inFileZ == NULL) { cout<<" Erreur";printf("Error: Failed to gzopen %s\n", fileout.c_str()); exit(0);}
        else{ cout<<" Fichier ouvert \n";}
       unsigned char unzipBuffer[8192];
       unsigned int unzippedBytes;
       std::vector<int> unzippedData;
       while (true) {
            unzippedBytes = gzread(inFileZ, unzipBuffer, 8192);
            if (unzippedBytes > 0) {
                unzippedData.insert(unzippedData.end(), unzipBuffer, unzipBuffer + unzippedBytes);
            } else {
                break;
            }
        }
     
     
       gzclose(inFileZ);
    cout<<"\n Resultat \n";
    for (auto const valeur : unzippedData)
        {std::cout << valeur << " ";   }
     
    return 0;
    }
    J'ai plusieurs problèmes.
    D'abord je passe par un fichier intermediaire fileout , ce qui n'est pas tres utile mais je n'arrive pas a utiliser correctement le Buffer, je pense que la solution est très simple mais je suis trop debutant !
    Meme si j'arrive à compiler , la decompression ne marche visiblement pas, j'obtiens la meme sortie que pour le fichier compressé.

    Merci de votre aide

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2015
    Messages : 35
    Points : 37
    Points
    37
    Par défaut Reponse Chat gpt
    Rebonjour,
    Je me suis essayé à demander la réponse à Chat GPT (C'est la première fois que j'essayais ChatGPT) .

    Après 2 3 essais, La réponse fournie fonctionne et me convient parfaitement , Le resultat est etonnant
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include <iostream>
    #include <fstream>
    #include <zlib.h>
    #include <vector>
     
    int main() {
        //std::string filename = "nom_du_fichier.bin";
        std::string  filename= "Divers/modeles/1_2_47.deg";
        // Ouverture du fichier en mode binaire
        std::ifstream infile(filename, std::ios::binary);
     
        if (!infile) {
            std::cerr << "Erreur: impossible d'ouvrir le fichier " << filename << std::endl;
            return 1;
        }
     
        // Lecture de l'entête
        char header[11];
        infile.read(header, 11);
     
        // Lecture du bloc de données
        std::vector<char> gzbuf((std::istreambuf_iterator<char>(infile)), std::istreambuf_iterator<char>());
     
        // Décompression du bloc de données
        std::vector<int8_t> databuf(730 * 730);
        z_stream zs;
        zs.zalloc = Z_NULL;
        zs.zfree = Z_NULL;
        zs.opaque = Z_NULL;
        zs.avail_in = gzbuf.size();
        zs.next_in = (Bytef*) gzbuf.data();
        zs.avail_out = databuf.size() * sizeof(int8_t);
        zs.next_out = (Bytef*) databuf.data();
     
        if (inflateInit2(&zs, -MAX_WBITS) != Z_OK) {
            std::cerr << "Erreur: impossible d'initialiser la décompression." << std::endl;
            return 1;
        }
     
        int ret = inflate(&zs, Z_FINISH);
        if (ret != Z_STREAM_END) {
            std::cerr << "Erreur: impossible de décompresser les données." << std::endl;
            inflateEnd(&zs);
            return 1;
        }
     
        inflateEnd(&zs);
     
        // Conversion des données en une matrice de 730 par 730 entiers
        std::vector<std::vector<int>> matrix(730, std::vector<int>(730));
        for (int i = 0; i < 730; i++) {
            for (int j = 0; j < 730; j++) {
                int idx = i * 730 + j;
                matrix[i][j] = static_cast<int>(databuf[idx]);
            }
        }
     
        //Affichage de la matrice
        for (int i = 0; i < 730; i++) {
            for (int j = 0; j < 730; j++) {
                std::cout << matrix[i][j] << " ";
            }
            std::cout << std::endl;
        }
     
     
        return 0;
    }

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 869
    Points : 219 093
    Points
    219 093
    Billets dans le blog
    121
    Par défaut
    Bonjour,

    Félicitations pour votre code (s'il correspond à ce que vous vouliez). Je me demandais, est-ce que binwalk n'aurait pas pu vous le faire automatiquement ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

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

Discussions similaires

  1. lire un fichier binaire à partie de la base de donnée
    Par selmagsi dans le forum Général Java
    Réponses: 0
    Dernier message: 01/04/2015, 21h07
  2. [LG]ecriture dans un fichier binaire
    Par jsaviola dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2003, 17h30
  3. [Debutant] Comment lire la taille d'un fichier binaire ?
    Par Invité dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 18/12/2003, 19h20
  4. communication fichier binaire fichier txt
    Par micdie dans le forum C
    Réponses: 3
    Dernier message: 05/12/2002, 00h19
  5. fichier binaire ou texte
    Par soussou dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/06/2002, 13h39

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