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 :

Compression Huffman en c.


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 172
    Points : 68
    Points
    68
    Par défaut Compression Huffman en c.
    Bonjour,

    Je suis en train d'étudier la compression Huffman et comment l'adapter en C et il y a un point que je ne comprend pas.

    Mon problème est de savoir comment je vais écrire dans mon fichier compressé après avoir fait mon arbre, en effet en c il n'est possible d'écrire dans un fichier binaire que 8 bits par 8 bits, et pas bits par bits, alors comment faire pour inscrire un 'e' (qui ne sera composé seulement de 3 bits 101) dans mon fichier compressé ?

    J'espère que j'ai été assez clair.

    Si vous pouvez m'éclairer ?
    Merci.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Dans ce cas, effectivement, tu ne peux pas écrire les 3 bits.

    Donc tu les gardes quelques part et tu traites le caractères suivants en ajoutant les bits du caractère suivant à ces 3 bits. Dès que tu as 8 bits, tu les écris, tu supprimes les 8 bits écrit de ta mémoire et tu continues.

    Bien sûr, il faut gérer les cas un peu plus spéciaux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    caractère ==> 3 bits ==> 0 + 3 = 3 bits en attente
    caractère ==> 9 bits ==> 3 + 9 = 12 bits en attente ==> ecrire 8 bits, reste 4 bits
    caractère ==> 5 bits ==> 4 + 5 = 9 bits en attente ==> ecrire 8 bits, reste 1 bits
    ...
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 172
    Points : 68
    Points
    68
    Par défaut
    Et le mieux pour stocker les bits en attentes, c'est d'utiliser un champs de bits ? ou il y a une meilleur solution ?

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    Champ de bits ou bien tu peux t'amuser avec les decalages et les |. Je pense que niveau performance, ca doit s'equivaloir (ca se dit ca? )

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par wadabush Voir le message
    Champ de bits ou bien tu peux t'amuser avec les decalages et les |.
    Je jouerai plutôt avec les opérateurs de décalage (<<, >>) et les opérateurs logiques (&, |). J'ai peut que tu te prennes la tête pour rien avec les champs de bits.

    Citation Envoyé par wadabush Voir le message
    ... ca doit s'equivaloir (ca se dit ca?
    PS, je viens de vérifier, le verbe equivaloir existe bien dans le Larousse
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    L'idéal est quand même d'avoir, au minimum, un buffer de 8 bits (un char) en sortie, dans lequel tu "pousses" les bits un par un par décalages successifs et masquage. Quand l'octet-buffer est plein, tu l'écris sur le disque (ou vers un autre buffer plus gros, si les performances sont un souci), et tu recommences à zéro.
    Les champs de bits, c'est vraiment pas une bonne idée pour faire ce genre d'opération, par contre, je te le déconseille.

    Solution déjà testée et validée en Ada, langage infiniment plus restrictif que le C, et qui n'a pas bronché d'un poil face à cette méthode...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Pour info, vous opposez une méthode utilisant un buffer de n char (n*8 bits) avec décalages à droite, à gauche et utilisation des masques et une autre utilisant des "champs de bits".

    Si je vois parfaitement à quoi correspond la première méthode, celle que j'aurais utilisée "naturellement", je ne vois pas à quoi fait référence la deuxième. Qu'entendez-vous par "champs de bits" ?
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par plxpy Voir le message
    Qu'entendez-vous par "champs de bits" ?
    Ça :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct {
        char bit0 : 1 ;
        char bit1 : 1 ;
        char bit2 : 1 ;
        char bit3 : 1 ;
        char bit4 : 1 ;
        char bit5 : 1 ;
        char bit6 : 1 ;
        char bit7 : 1 ;
    } char_bitfield ;
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  9. #9
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Ok, merci. J'avais pris le terme "champs" de façon générale, et pas comme "champs d'une structure".
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  10. #10
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par plxpy Voir le message
    Ok, merci. J'avais pris le terme "champs" de façon générale, et pas comme "champs d'une structure".
    C'est le terme consacré en C : "bitfields" en anglais, "champs de bits" en français. Quand tu verras ces termes dans une discussion C/C++, c'est très rarement autre chose que les structures dans le genre de l'exemple ci-dessus... Et quand c'est autre chose, c'est en général précisé explicitement.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  11. #11
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Dans le cadre des bits, je ne suis pas tout à fait d'accord.

    "A bit field is a common idiom used in computer programming to store a set of Boolean datatype flags compactly, as a series of bits. The bit field is stored in an integral type of known, fixed bit-width." (wikipedia)

    Autant le terme "champ", dans tout autre contexte, m'aurait, évidemment, fait penser à un champ d'une structure, autant là ça pouvait porter à confusion. Mais c'est du détail.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  12. #12
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par plxpy Voir le message
    "A bit field is a common idiom used in computer programming to store a set of Boolean datatype flags compactly, as a series of bits. The bit field is stored in an integral type of known, fixed bit-width." (wikipedia)
    Ce qui est exactement ce dont on parle : les données sont bien une série de bits compacts (pas d'espace entre les divers bits), et c'est stocké dans un type intégral connu de taille fixe (un "char" dans l'exemple ci-dessus)...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    J'aurais une question concernant ces bits fields.

    Ce qui est exactement ce dont on parle : les données sont bien une série de bits compacts (pas d'espace entre les divers bits), et c'est stocké dans un type intégral connu de taille fixe (un "char" dans l'exemple ci-dessus)...

    Est-ce que la chose suivante est tout le temps vraie?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct {
        char bit0 : 1 ;
        char bit1 : 1 ;
        char bit2 : 1 ;
        char bit3 : 1 ;
        char bit4 : 1 ;
        char bit5 : 1 ;
        char bit6 : 1 ;
        char bit7 : 1 ;
    } char_bitfield ;
    Si je caste le premier element de mon champ de bits en char, je retrouve la valeur du char correspondant a mon champ de bit?

    Pour moi la reponse est non, et depend tres serieusement du compilo. Des commentaires?

  14. #14
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par wadabush Voir le message
    Si je caste le premier element de mon champ de bits en char, je retrouve la valeur du char correspondant a mon champ de bit?
    Non : si tu castes le champ lui-même (struct.bit0), tu n'obtiendras que la valeur 0 ou 1, étendue au nombre de bits correspondant au type destination (ex : 32 classiquement avec un cast (int)). Tu ne retrouverais la valeur du char que si tu castes la structure elle-même, ou que tu la couples avec un char dans une union bien sûr.

    Citation Envoyé par wadabush Voir le message
    Pour moi la reponse est non, et depend tres serieusement du compilo. Des commentaires?
    En fonction du compilateur et de l'endianness de la cible, le premier bit déclaré n'est pas forcément le même bit dans l'octet. Il y a des inversions entre GCC / Big-endian et Visual / Little-endian, par exemple, j'ai déjà eu la farce... Ce qui rend l'écriture de telles structures hautement dépendant de la plate-forme et du compilateur, et donc en général fortement déconseillé en dehors des couches très bas niveau.
    Pour être honnête, en dehors des bouts de code tapant dans des registres / ports I/O et des protocoles réseau, je n'ai jamais vu de nécessité impérative d'utiliser les bitfields... Or, justement, ces deux types de code sont inextricablement liés à la machine et/ou au compilateur / OS...

    Par contre, l'insertion des bits par des décalages / masques, elle, est toujours portable sans restriction tant que tu ne sérialises pas (à ce moment, l'endianness peut jouer si tu travailles sur plus de 8 bits). Mais en restant sur un flux d'octet, même l'endianness n'a plus aucun impact.

    Toutefois, en théorie, l'accès par un bitfield est plus rapide que par des décalages / masques manuels, car le compilateur peut utiliser des trucs assez immondes pour optimiser l'accès (ex : décalage bourrin de la valeur et test direct du flag Carry), tout particulièrement en lecture. Comme souvent, tu dois donc trancher entre performances maximales et portabilité...
    De plus, dans ce cas particulier du codage de Huffman, je trouve le code avec les décalages plus agréable à lire que celui via les bitfields, car ce dernier ne permet pas l'accès via des boucles et impose des séries hideuses de "switch" assez moches ou l'utilisation de macros encore plus moches...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    Ok merci de l'eclaircicement.

    Je n'ai en effet vu l'emploi de ces bit fields seulement dans des couches plateformes dependant, ce qui confirme ce que tu viens de dire!

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

Discussions similaires

  1. Algorithme de compression de Huffman, extention pour tout n.
    Par born_to_eat dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 30/10/2008, 15h28
  2. compresser avec l'executable de huffman
    Par memo07 dans le forum C++Builder
    Réponses: 0
    Dernier message: 30/11/2007, 01h47
  3. Réponses: 16
    Dernier message: 07/05/2006, 13h19
  4. Compression Huffman.Exception de SE.
    Par niko.nik2 dans le forum Langage
    Réponses: 2
    Dernier message: 05/05/2006, 09h32

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