home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 21
/
CD_ASCQ_21_040595.iso
/
dos
/
prg
/
c
/
complzw
/
lisezmoi.txt
< prev
next >
Wrap
Text File
|
1995-02-04
|
9KB
|
210 lines
Domaine d'intérêt et contenu de la disquette
--------------------------------------------
Elle présente des classes réalisant la compression et décompression LZW
en Borland C++ version 3.1. Voici l'inventaire des fichiers :
compr.exe, dcompr.exe exécutables
(règles d'usage expliquées plus bas)
compr.cpp, dcompr.cpp programmes principaux
traite.inc source complémentaire
inclu dans compr.cpp et dcompr.cpp
lzw.h, lzw.cpp classe LZW
lzwdico.h, lzwdico.cpp classe du dictionnaire
spécifique de l'algorythme
crc32.h crc32.cpp classe de calcul de crc
pour les vérifications
Remarque : tous les sources cités furent édités dans l'EDI Borland
avec des tabulations réglées à 3.
Installation
------------
C'est un bien grand mot : il suffit de copier les fichiers dans l'un de
vos répertoires consacrés aux applications compilables sous Borland C++.
Les 2 exécutables sont à copier dans l'un des répertoires de votre path.
Origine du projet
-----------------
La réalisation de ces programmes ne répondait pas alors à un besoin
immédiat. En fait j'avais été frappé par un article sur les méthodes
de compression, paru dans PC Expert. La pauvreté de l'exposé, l'étran-
geté des commentaires, montraient à l'évidence que l'auteur de cet ar-
ticle ne comprenait pas lui-même les petits morceaux de programmes qu'il
avait hâtivement recopiés Dieu sait où. Mais, du coup, moi je ne com-
prenais pas non plus, et je déteste cela...ce qui m'a décidé à prendre
le taureau par les cornes ! (cf bibliographie, un peu plus loin)
Usage des exécutables compr.exe et dcompr.exe
---------------------------------------------
Donnons l'exemple pour la compression :
- comprimer 1 fichier : compr source cible
où source et cible sont les noms ou les chemins du fichier existant
à comprimer et du nouveau fichier comprimé (avec leurs extensions).
- comprimer plusieurs fichiers :
créer un fichier d'ordres dont le nom commence par un @, et
contenant des lignes : source1 cible1 (séparateurs espaces
source2 cible2 ou tabulations)
...
(les lignes vides sont admises)
spécifier ensuite : compr @ordres (nom du fichier d'ordres)
La décompression s'effectue de façon analogue.
Exemple fourni : le fichier batch exemple.bat enchaine 2 fichiers d'ordres
qui compriment, puis décompriment à nouveau 2 fichiers du répertoire, puis
comparent le résultat aux fichiers de départ. Voir @ex_comp et @ex_decom.
Remarques importantes :
- il n'est pas intéressant de comprimer des fichiers logés sur une unité
comprimée, car cela n'amène qu'une exécution sensiblement plus lente :
malgré l'affichage de dir (qui donne la taille originale), les fichiers
sont en fait déjà comprimés par dblspace !
- ne pas s'étonner du facteur de compression décevant obtenu sur ces fi-
chiers d'exemple : ils sont trop petits ; les performances s'améliorent
pour de grands fichiers (de texte), car le dictionnaire s'enrichit alors
de chaînes redondantes de plus en plus nombreuses. Les fichiers .exe, en
revanche, sont moins bien comprimables (par toutes les méthodes).
Bibliographie
-------------
Le livre fondamental de Mark Nelson : "La compression de données" (Dunod)
m'a tout appris, y compris la programmation détaillée en C ANSI de l'al-
gorythme LZW. Je n'ai fait qu'encapsuler tout cela dans des classes plus
agréables et plus sûres.
Etant donné que ce livre explique patiemment le fonctionnement de l'algo-
rythme sur des exemples, je ne pense pas que vous pourrez vous en passer
si vous avez un intérêt sérieux pour le sujet.
Examen des sources fournis
--------------------------
Des commentaires de programmation détaillés figurent dans les sources.
Cela serait une mauvaise idée de commencer par les programmes princi-
paux puisque, comme d'habitude, ils ne contiennent rien d'autre qu'une
analyse succinte de la ligne de commande, et le lancement du traitement.
Au contraire, voici l'ordre d'examen conseillé :
lzw.h commentaire abondant sur la méthode LZW
lzw.cpp commentaires sur les détails de programmation
lzwdico.h, lzwdico.cpp commentaires sur la classe représentant le
dictionnaire utilisé dans la méthode LZW
crc32.h, crc32.cpp calcul de crc (à sauter en première lecture)
traite.inc compléments de source inclus dans les pro-
grammes principaux
compr.cpp, dcompr.cpp programmes principaux
Attention : la compréhension du code nécessite une bonne connaissance de
C++, il ne s'agit certes pas d'une introduction. Sont notamments utilisés :
- fonctions virtuelles ;
- héritage multiple avec dérivations virtuelles ;
- classes template ;
- une pile de la librairie CLASSLIB version template ;
- type et variable pointeur sur fonction membre.
Une partie du source manque
---------------------------
La méthode LZW (comme les autres) doit, à un moment donné, échanger avec
le disque des "rafales" de bits, et non des octets, car la codification
du fichier comprimé est conçue pour être la plus courte possible.
Mark Nelson donne dans son livre des fonctions d'entrées-sorties de bits
sur disque ; mais j'ai préféré construire des classes faisant ce travail :
- elles sont greffées sur les classes de flux d'octets de C++ (iostream) ;
- elles sont utilisables simultanément avec celles-ci (elles en héritent) ;
- elles sont conçues de façon très analogue aux classes de flux d'octets,
y compris pour la gestion interne des tampons de bits.
Cet exercice m'a appris beaucoup sur la conception de la librairie de flux
de C++, forcé que j'étais de l'étudier pour atteindre mon but...
Les fichiers supplémentaires (non fournis) qui implémentent cette librairie
d'E/S de bits sont les suivants :
bits.h manipulations élémentaires de bits dans un mot
bitsbuf.h tampon de bits, très analogue à streambuf
iosbit.h racine de la hiérarchie des classes de bits (cf ios)
fbitbase.h, fbitbase.cpp ce qui est commun aux entrées et aux sorties de bits
fbits.h, fbits.cpp classes d'entrée, de sortie et d'entrée-sortie
Après obtention de ces fichiers (cf ci-dessous), vous serez en possession
de programmes source complets, compilables sous BC++ 3.1.
Une alternative serait de réaliser vous-même ces classes (bon exercice !).
Remarque importante : ces programmes ne sont pas immédiatement transposables
sous compilateur Microsoft, car celui-ci ne connait pas les template (hou !).
Comment obtenir ces fichiers
----------------------------
L'étude et l'utilisation des fichiers fournis est absolument libre de droits,
vis à vis de moi s'entend (attention, certaines parties de l'algorythme LZW
seraient brevetées, comme je le rappelle dans un commentaire de lzw.h).
En revanche, pour obtenir le source complet des entrées-sorties de bits, je
vous demande une petite contribution de...55F ! Pour cette somme, vous obte-
nez un "insight" très intéressant sur le fonctionnement d'un tampon streambuf
(car notre tampon de bits lui ressemble), et sur la façon de "greffer" des
fonctionnalités supplémentaires à une hiérarchie existante (classes de flux
d'octets C++) à l'aide de l'héritage multiple.
Permettez-moi de souligner qu'il ne s'agit pas de pures spéculations : la va-
lidité du travail est confirmée par le fonctionnement correct de ces classes
contribuant aux programmes exécutables fournis.
Pour terminer, je fais les réserves d'usage : malgré les assurances données il
y a un instant, on ne peut exclure que telle ou telle fonction, dans tel ou
tel cas particulier, soit défaillante. Vous acceptez par avance l'idée que
les fichiers fournis constituent pour vous une simple base de départ, et que
vous êtes seul responsable de leur mise en oeuvre si vous jugez qu'ils peuvent
convenir à vos buts...
Je suis évidemment intéressé par toute remarque ou suggestion !
Voici mon adresse pour ces remarques...et le petit chèque :
----------------------------
Alain NAIGEON
39, boulevard de la victoire
67000 Strasbourg
----------------------------