home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 21 / CD_ASCQ_21_040595.iso / dos / prg / c / complzw / lisezmoi.txt < prev    next >
Text File  |  1995-02-04  |  9KB  |  210 lines

  1. Domaine d'intérêt et contenu de la disquette
  2. --------------------------------------------
  3.  
  4. Elle présente des classes réalisant la compression et décompression LZW
  5. en Borland C++ version 3.1. Voici l'inventaire des fichiers :
  6.  
  7. compr.exe,      dcompr.exe      exécutables 
  8.                                 (règles d'usage expliquées plus bas)
  9.  
  10. compr.cpp,      dcompr.cpp      programmes principaux
  11.  
  12. traite.inc                      source complémentaire 
  13.                                 inclu dans compr.cpp et dcompr.cpp
  14.  
  15. lzw.h,          lzw.cpp         classe LZW
  16.  
  17. lzwdico.h,      lzwdico.cpp     classe du dictionnaire 
  18.                                 spécifique de l'algorythme
  19.  
  20. crc32.h         crc32.cpp       classe de calcul de crc 
  21.                                 pour les vérifications
  22.  
  23. Remarque : tous les sources cités furent édités dans l'EDI Borland 
  24. avec des tabulations réglées à 3.
  25.  
  26.  
  27.  
  28. Installation
  29. ------------
  30.  
  31. C'est un bien grand mot : il suffit de copier les fichiers dans l'un de
  32. vos répertoires consacrés aux applications compilables sous Borland C++.
  33. Les 2 exécutables sont à copier dans l'un des répertoires de votre path.
  34.  
  35.  
  36.  
  37. Origine du projet
  38. -----------------
  39.  
  40. La réalisation de ces programmes ne répondait pas alors à un besoin
  41. immédiat. En fait j'avais été frappé par un article sur les méthodes
  42. de compression, paru dans PC Expert. La pauvreté de l'exposé, l'étran-
  43. geté des commentaires, montraient à l'évidence que l'auteur de cet ar-
  44. ticle ne comprenait pas lui-même les petits morceaux de programmes qu'il
  45. avait hâtivement recopiés Dieu sait où. Mais, du coup, moi je ne com-
  46. prenais pas non plus, et je déteste cela...ce qui m'a décidé à prendre
  47. le taureau par les cornes ! (cf bibliographie, un peu plus loin)
  48.  
  49.  
  50.  
  51.  
  52. Usage des exécutables compr.exe et dcompr.exe
  53. ---------------------------------------------
  54.  
  55. Donnons l'exemple pour la compression :
  56.  
  57. - comprimer 1 fichier :         compr source cible
  58.   
  59.   où source et cible sont les noms ou les chemins du fichier existant
  60.   à comprimer et du nouveau fichier comprimé (avec leurs extensions).
  61.  
  62. - comprimer plusieurs fichiers :
  63.  
  64.         créer un fichier d'ordres dont le nom commence par un @, et
  65.         contenant des lignes :  source1 cible1  (séparateurs espaces
  66.                                 source2 cible2   ou tabulations)
  67.                                 ...
  68.                 (les lignes vides sont admises)
  69.  
  70.         spécifier ensuite :     compr @ordres (nom du fichier d'ordres)
  71.  
  72. La décompression s'effectue de façon analogue.
  73.  
  74. Exemple fourni : le fichier batch exemple.bat enchaine 2 fichiers d'ordres
  75. qui compriment, puis décompriment à nouveau 2 fichiers du répertoire, puis
  76. comparent le résultat aux fichiers de départ. Voir @ex_comp et @ex_decom.
  77.  
  78. Remarques importantes : 
  79.  
  80. - il n'est pas intéressant de comprimer des fichiers logés sur une unité 
  81.   comprimée, car cela n'amène qu'une exécution sensiblement plus lente : 
  82.   malgré l'affichage de dir (qui donne la taille originale), les fichiers 
  83.   sont en fait déjà comprimés par dblspace !
  84. - ne pas s'étonner du facteur de compression décevant obtenu sur ces fi-
  85.   chiers d'exemple : ils sont trop petits ; les performances s'améliorent
  86.   pour de grands fichiers (de texte), car le dictionnaire s'enrichit alors
  87.   de chaînes redondantes de plus en plus nombreuses. Les fichiers .exe, en
  88.   revanche, sont moins bien comprimables (par toutes les méthodes).
  89.  
  90.  
  91.  
  92. Bibliographie
  93. -------------
  94.  
  95. Le livre fondamental de Mark Nelson : "La compression de données" (Dunod)
  96. m'a tout appris, y compris la programmation détaillée en C ANSI de l'al-
  97. gorythme LZW. Je n'ai fait qu'encapsuler tout cela dans des classes plus
  98. agréables et plus sûres.
  99. Etant donné que ce livre explique patiemment le fonctionnement de l'algo-
  100. rythme sur des exemples, je ne pense pas que vous pourrez vous en passer
  101. si vous avez un intérêt sérieux pour le sujet.
  102.  
  103.  
  104.  
  105. Examen des sources fournis
  106. --------------------------
  107.  
  108. Des commentaires de programmation détaillés figurent dans les sources.
  109. Cela serait une mauvaise idée de commencer par les programmes princi-
  110. paux puisque, comme d'habitude, ils ne contiennent rien d'autre qu'une
  111. analyse succinte de la ligne de commande, et le lancement du traitement.
  112.  
  113. Au contraire, voici l'ordre d'examen conseillé :
  114.  
  115. lzw.h                   commentaire abondant sur la méthode LZW
  116. lzw.cpp                 commentaires sur les détails de programmation
  117.  
  118. lzwdico.h, lzwdico.cpp  commentaires sur la classe représentant le
  119.                         dictionnaire utilisé dans la méthode LZW
  120.  
  121. crc32.h, crc32.cpp      calcul de crc (à sauter en première lecture)
  122.  
  123. traite.inc              compléments de source inclus dans les pro-
  124.                         grammes principaux
  125.  
  126. compr.cpp, dcompr.cpp   programmes principaux
  127.  
  128.  
  129. Attention : la compréhension du code nécessite une bonne connaissance de 
  130. C++, il ne s'agit certes pas d'une introduction. Sont notamments utilisés :
  131. - fonctions virtuelles ;
  132. - héritage multiple avec dérivations virtuelles ;
  133. - classes template ;
  134. - une pile de la librairie CLASSLIB version template ;
  135. - type et variable pointeur sur fonction membre.
  136.  
  137.  
  138.  
  139.  
  140. Une partie du source manque
  141. ---------------------------
  142.  
  143. La méthode LZW (comme les autres) doit, à un moment donné, échanger avec
  144. le disque des "rafales" de bits, et non des octets, car la codification
  145. du fichier comprimé est conçue pour être la plus courte possible.
  146.  
  147. Mark Nelson donne dans son livre des fonctions d'entrées-sorties de bits
  148. sur disque ; mais j'ai préféré construire des classes faisant ce travail :
  149. - elles sont greffées sur les classes de flux d'octets de C++ (iostream) ;
  150. - elles sont utilisables simultanément avec celles-ci (elles en héritent) ;
  151. - elles sont conçues de façon très analogue aux classes de flux d'octets,
  152.   y compris pour la gestion interne des tampons de bits.
  153.  
  154. Cet exercice m'a appris beaucoup sur la conception de la librairie de flux
  155. de C++, forcé que j'étais de l'étudier pour atteindre mon but...
  156.  
  157. Les fichiers supplémentaires (non fournis) qui implémentent cette librairie
  158. d'E/S de bits sont les suivants :
  159.  
  160. bits.h                          manipulations élémentaires de bits dans un mot
  161. bitsbuf.h                       tampon de bits, très analogue à streambuf
  162. iosbit.h                        racine de la hiérarchie des classes de bits (cf ios)
  163. fbitbase.h, fbitbase.cpp        ce qui est commun aux entrées et aux sorties de bits
  164. fbits.h, fbits.cpp              classes d'entrée, de sortie et d'entrée-sortie
  165.  
  166.  
  167. Après obtention de ces fichiers (cf ci-dessous), vous serez en possession 
  168. de programmes source complets, compilables sous BC++ 3.1.
  169. Une alternative serait de réaliser vous-même ces classes (bon exercice !).
  170.  
  171. Remarque importante : ces programmes ne sont pas immédiatement transposables
  172. sous compilateur Microsoft, car celui-ci ne connait pas les template (hou !).
  173.  
  174.  
  175.  
  176. Comment obtenir ces fichiers
  177. ----------------------------
  178.  
  179. L'étude et l'utilisation des fichiers fournis est absolument libre de droits,
  180. vis à vis de moi s'entend (attention, certaines parties de l'algorythme LZW
  181. seraient brevetées, comme je le rappelle dans un commentaire de lzw.h).
  182. En revanche, pour obtenir le source complet des entrées-sorties de bits, je
  183. vous demande une petite contribution de...55F ! Pour cette somme, vous obte-
  184. nez un "insight" très intéressant sur le fonctionnement d'un tampon streambuf
  185. (car notre tampon de bits lui ressemble), et sur la façon de "greffer" des
  186. fonctionnalités supplémentaires à une hiérarchie existante (classes de flux
  187. d'octets C++) à l'aide de l'héritage multiple.
  188.  
  189. Permettez-moi de souligner qu'il ne s'agit pas de pures spéculations : la va-
  190. lidité du travail est confirmée par le fonctionnement correct de ces classes
  191. contribuant aux programmes exécutables fournis.
  192.  
  193. Pour terminer, je fais les réserves d'usage : malgré les assurances données il
  194. y a un instant, on ne peut exclure que telle ou telle fonction, dans tel ou
  195. tel cas particulier, soit défaillante. Vous acceptez par avance l'idée que
  196. les fichiers fournis constituent pour vous une simple base de départ, et que
  197. vous êtes seul responsable de leur mise en oeuvre si vous jugez qu'ils peuvent
  198. convenir à vos buts...
  199. Je suis évidemment intéressé par toute remarque ou suggestion !
  200.  
  201.  
  202. Voici mon adresse pour ces remarques...et le petit chèque :
  203.  
  204. ----------------------------
  205. Alain NAIGEON
  206. 39, boulevard de la victoire
  207. 67000 Strasbourg
  208. ----------------------------
  209.  
  210.