On se propose de réaliser, par étapes successives, un logiciel de (dé)compression basé sur la technique RLE et le code de Golomb.
Le principe du codage RLE (Run Length Encoding) est d'obtenir à partir d'une suite de nombre supposée contenir des répétitions consécutives de mêmes valeurs, une suite contenant:
Un tel codage nécessite en pratique d'insérer dans la suite construite des marqueurs permettant de réaliser le décodage.
Il est facile d'observer que, par une telle méthode, certaines suites sont «compressées»; la longueur de la suite après codage est plus petite que la longueur de la suite originale.
La suite aaaaabcbaaaaaabbbbbb
(de longueur 20)
pourraît être
encodée de façon à produire la suite [RLE]5abcb[RLE]6a[RLE]6b
(de
longueur 12).
1. Il est demandé de réaliser dans un langage de
programmation de votre choix un
programme d'encodage et de décodage RLE (basé sur le principe précédent). Ce
programme devra permettre d'encoder tout fichier donné en entrée et produire
en sortie un fichier dont le nom sera étendu en .rl1
. Ce
programme devra en outre produire en sortie le taux de compression obtenu.
Ce programme pourra être paramétré de façon à permettre à l'utilisateur de choisir ce qu'il considère comme étant un caractère de la suite.
On testera ce programme sur une variété de fichiers communs: texte français, binaire, bitmap d'image, etc.
De nombreuses variantes de ce principe sont utilisées. Par exemple, si la suite considérée est une suite de bits, on peut s'intéresser aux suites de 0 consécutifs situés entre deux 1.
La suite 00000100110000000101011
peut être
représentée par la suite 52071100
.
2. Écrire un programme (dans le langage de votre choix)
permettant de coder et décoder tout fichier considéré comme une suite de
bits. Le fichier résultat sera nommé en utilisant l'extension
.rl2
.
3. On étudiera les relations entre cet encodage et le précédent. Du point de vue de l'encodage lui-même, de leurs performances relatives, etc.
4. On recherchera la spécification de formats courants utilisant le codage RLE. On comparera les techniques employées dans ces divers formats avec celles réalisées dans ce TP.
En ce qui concerne le RLE du second type et précédemment décrit le
problème principal est de trouver un codage adéquat pour la suite des nombres
produits; i.e. comment coder la suite 52071100
? Le code
de Golomb permet de construire un codage de longueur variable permettant
d'obtenir une compression raisonnablement efficace.
Pour l'entier n, Golombd(n) est construit par concaténation du codage unaire du quotient de n/d et du codage binaire tronqué du reste de n/d.
Le codage unaire d'un entier i est une suite de i
1
suivie d'un 0
. Le nombre 5
se code
donc 111110
.
Le codage binaire tronqué de l'entier i, CBTd(i) est obtenu de la façon suivante:
Ainsi pour d=5, le codage du nombre 23 sera 11110110
, car
11110
est le codage unaire de 4 (23/5=4) et 110
le
codage sur 3 bits de 6 (on cherche CBT5(3), on sait que
23-(5-3)=6).
Comment déterminer une valeur adéquate pour d ? Il suffit de prendre la médiane de la suite à coder.
5 (difficile). Écrire un programme permettant de coder et décoder tout fichier considéré comme une suite de bits en utilisant le code de Golomb.
Le TP devra être rédigé (sous la forme de documents HTML) et rendu avec les codes sources des programmes; ce au plus une semaine après la séance.