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 :

[Binaire] Comment s'y prendre ?


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 93
    Par défaut [Binaire] Comment s'y prendre ?
    Bonjour à tous !

    Eh bien voilà... j'ai eu l'idée peu originale de faire un compresseur (décompresseur) de fichier dans le but de me faire un peu la main (algo et c++).

    Deux questions me viennent pour l'instant :

    1) Est-ce possible de charger un fichier en binaire dans un buffer ?
    2) Si oui, comment ? Puis, est-ce possible de travailler directement sur le buffer. Par exemple j'ai une suite de 1000111001010101 (exemple fictif) bah j'aimerais la prendre tel quel et la modifier en 1,2,3,52,1,0,0,1,1,12 (exemple fictif mais c'est à base d'entier et de virgules) et, ensuite, réécrire ce "code pseudo-binaire" sous forme d'un fichier qui représente l' "archive compressée".

    Le tout dans le but de permettre une décompression : reprendre le code pseudo-binaire et puis le retransformer en code binaire et l'enregistrer sous forme de fichier "normal" sachant qu'il y aura une sorte de "header" interne au fichier qui contiendra l'extention du (des) fichier(s) (au plusieurs pour le long terme car je compte pouvoir y mettre plusieurs fichiers (dans l'archive).

    Voilà voilà (suis-je fou ?). Je précise que j'ai un niveau très moyen et que je ne maitrise pas le C++... mais ça, c'est pas un problème j'ai juillet/aout pour finir ce projet.

    En tous cas je vous remercie pour vos réponses . (j'ai évidemment effectué une recherche mais pas rencontré le même genre d'idée que moi et/ou j'avais des problèmes pour l'adaptation).

    Pour info j'ai "Le langage C++" de B. Stroustrup (est-ce qu'il suffira ?).



    Ah oui, j'ai failli oublier : à ce stade-ci le rendement n'est pas du tout ma priorité (que du contraire...).
    Et tant que j'y suis, le(s) fichier(s) à compresser seront non spécifiés. Donc du jpeg au texte en passant par des mp3 (même si les formats multimédia sont déjà compressés... en gros c'est pour ca que je compte passer en binaire : pour faire abstraction du contenu du fichier)).

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Le C++ ne permet pas de travailler sur les bits directement, mais il te suffit de faire une classe de lecture bit par bit et c'est bon. Si tu prends un ifstream en mode binaire, tu lis comme sur un buffer - logique, C'EST un buffer -

  3. #3
    Membre confirmé
    Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 93
    Par défaut
    Citation Envoyé par Miles
    Le C++ ne permet pas de travailler sur les bits directement, mais il te suffit de faire une classe de lecture bit par bit et c'est bon. Si tu prends un ifstream en mode binaire, tu lis comme sur un buffer - logique, C'EST un buffer -
    Je t'avoue ne pas avoir tout compris .

    Donc, si je comprends bien :

    1) faire une classe de lecture bit par bit
    2) c'est bon ?

    3) => j'ai rien compris

    Un rien plus sérieusement, la classe de lecture bit par bit ça veut dire quoi exactement ? Je dois l'implémenter moi-même ? Ca me parait assez étrange et je ne vois pas du tout par où commencer... aurais-tu une idée s'il te plaît ?

    Merci en tous cas

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Tu récupères des octets que tu vas traiter, mais tu dois créer une classe de traitement perso.

  5. #5
    Membre confirmé
    Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 93
    Par défaut
    D'accord merci je comprends un peu mieux.

    Je comprends aussi que je n'ai pas les compétences pour l'instant et que ça risque de me prendre un petit temps. Je vais donc utiliser google pour voir si quelqu'un n'a pas déjà inventé cette roue.

    Par contre, j'ai une autre petite question : est-ce qu'il y a un langage de programmation qui permet de prendre en charge de manière native les binaires ? (ou qui me permettra de faire ce que je veux un peu plus vite ?)

    Mais bon je vois déjà à peu près la réponse étant donné que le C++ est un langage qui peu aller en assez bas niveau donc bon. Puis je ne sais pas si c'est plus facile d'apprendre un autre langage que de créer une classe...


    edit :

    fopen, fclose, fread, fwrite avec ça je devrais pouvoir arriver à quelque chose ?

    http://www.cplusplus.com/ref/cstdio/fopen.html => avec le mode "wb"

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Attention tu confonds, là. Binaire au sens où on travaille sur les bits, ce n'est pas la même chose que le format binaire de lecture sur les flux...

  7. #7
    Membre confirmé
    Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 93
    Par défaut
    Hmmm c'est assez confus ça je l'admets volontier .

    Pourrais-tu m'expliquer rapidement la différence ? (en deux lignes hein)

    (où m'indiquer l'endroit où se trouvent ces infos sur le web parce que quand on passe en anglais byte bit binaire binary octets ... joli mélange donc :p)

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    La lecture binaire des flux, c'est juste qu'il recopie tel quel le contenu du flux dans le buffer. Le format binaire, c'est la suite de 0 et de 1 qui décrit un nombre en base 2.

  9. #9
    Membre confirmé
    Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 93
    Par défaut
    Donc c'est bien le format binaire que je veux récupérer (je veux que la suite de 1 et de 0).

    Ensuite quand j'aurais la suite je pourrais la compresser et la stocker dans un nouveau fichier. Puis pour la décompression je comptais faire le mécanisme inverse : régénérer le format binaire du fichier et le réecrire.

    C'est trop bas niveau ?

    Avec le flux binaire je pourrais sûrement pas faire ce que je comptais faire... puisque l'algo que j'ai prévu c'était pour un format binaire donc une suite de 0 et de 1.

    Visiblement c'est pas possible de faire ça (peux-tu simplement dans ce cas me le dire afin que j'arrête de chercher ?)

    Edit : ok j'ai à peu prés compris : va falloir manipuler des octets (plus petite unité adressable sur un processeur type intel) si j'ai tout bien compris.

    En gros, je dois accéder à un octet et ensuite le représenter en binaire. Puis, effectuer ma compression et stocker ça tout simplement. Pour recréer le fichier de départ : constituer des mots de 8 bits (octetcs) chacuns et puis sortir le fichier de départ. C'est bien ça ?

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Oui, c'est ça, mais tu vas plutôt travailler sur plusieurs octets à la fois, par exemple 4 si tu prends des unsigned ints sur une plateforme Windows 32bits.

  11. #11
    Membre confirmé
    Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 93
    Par défaut
    Donc <iostream> devrait suffir ? (j'essaie de savoir ce qu'il me faudra afin de réunir un max de documentation dessus pour comprendre le problème dans sa globalité).

  12. #12
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    Avec les streams C++ tu pourras charger l'intégralité (ou juste des morceaux) de ton fichier dans un buffer sans altérations (sans altérations <= lecture dite binaire).

    Ensuite, dans la lib standard tu as un conteneur à taille fixe qui permet d'acceder à chaque bit d'une structure de donnée (qu'il aura recopiée) => std::bitset. Dans boost, tu as une version dynamique de la même structure.
    Ce qui doit manquer (à confimer), c'est une version qui agit comme une vue sur un buffer géré ailleurs (ce qui n'est pas hyper compliqué à écrire une fois que l'on connait le fonctionnement des masquages).

    Maintenant, je ne suis pas sûr que passer au niveau du bit soit ce qu'il y a de plus efficace pour de la compression. J'ai plutôt l'impression qu'au contraire on cherche à aggréger des octets pour reconnaitre des séquences qui reviennent régulièrement dans tout le fichier à compresser.
    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...

  13. #13
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Par exemple pour du Huffmann ou de l'arithmétique, on a pas le choix, on doit passer de la lecture bit à bit. Si on fait du dictionnaire, c'est bon.

  14. #14
    Membre confirmé
    Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 93
    Par défaut
    Super ! Un intervenant de plus .

    Hmm ben ça fera "compression"/"cryptage" en même temps alors .

    Bref std::bitset... voilà une idée concrète ! J'espère que ça sera faisable.

    Maintenant pour le rendement j'ai bien précisé que c'était plus à titre éducatif qu'à un autre. Mais si j'arrive à des taux de 99% de compression (ainsi qu'à un cryptage hors du commun) je vous le ferai savoir sans problèmes :p.

    En attendant j'essaie juste de m'en sortir un peu .

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

Discussions similaires

  1. [LDAP] comment s'y prendre pour faire une recherche complexe
    Par dervish dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 10/03/2006, 14h56
  2. [MySQL] Comment s'y prendre pour une expiration après deux jours ?
    Par isa150183 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 21/01/2006, 20h36
  3. MySQL sous linux comment s'y prendre?
    Par Doberman dans le forum Débuter
    Réponses: 4
    Dernier message: 10/01/2006, 11h58
  4. Site multilingue : comment s'y prendre ?
    Par sg-40 dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 26/04/2005, 14h40
  5. Webbrowser : Comment ne pas prendre la page en cache
    Par cedm78 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 30/08/2002, 11h17

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