Lempel, Ziv and Welch
Exemple d'un flux compressé par l'algorithme Lzw...
Algorithme utilisé par Up ! System
L'algorithme mis au point par les mathématiciens Lempel, Ziv et Welch (LZW) a pour principe de coder sur un paquet de bits les suites d'octets qui se répètent.
La répétition est recherchée entre le début du flux et la position courante dans le flux. La taille minimale d'une suite d'octets se répétant est deux octets. La taille minimale NbBitsMin d'un codage d'une suite d'octets dépend de la plage des valeurs de tous les octets :
- 2 bits si les valeurs sont comprises entre 0 et 1 - Cas d'une image en noir et blanc.
- 3 bits si les valeurs sont comprises entre 0 et 3 - Cas d'une image en 4 couleurs.
- 4 bits si les valeurs sont comprises entre 0 et 7 - Cas d'une image en 8 couleurs.
- 5 bits si les valeurs sont comprises entre 0 et 15 - Cas d'une image en 16 couleurs.
- 6 bits si les valeurs sont comprises entre 0 et 31 - Cas d'une image en 32 couleurs.
- 7 bits si les valeurs sont comprises entre 0 et 63 - Cas d'une image en 64 couleurs.
- 8 bits si les valeurs sont comprises entre 0 et 127 - Cas d'une image en 128 couleurs.
- 9 bits si les toutes les valeurs sont utilisées - Cas d'une image en 256 couleurs ou d'un fichier quelconque.
Au fur et à mesure de la compression, une table mémorisant l'association entre une suite d'octets et son codage est constituée.
Dès lors que la suite d'octets est reconnue dans le flux, on tente de la prolonger par l'octet suivant de la sorte de mettre un seul nouveau codage. A défaut, le codage de la suite précédemment reconnue est inscrit.
Il est possible de créer un nouveau codage tant que le nombre maximal de bits de celui-ci n'est pas atteint. En ce cas, la table mémorisant l'association entre une suite d'octets et son codage doit être réinitialisée.
Cet algorithme n'est pas une norme : rien ne définit quelle est la taille maximale de l'encodage - nombre de bits maximal - et quoi faire quand la table est pleine.
Ce paramétrage varie en fonction de l'application utilisant l'algorithme. Par exemple, la compression pour les images au format Graphics Interchange Format (GIF) de CompuServe est paramétrée de la manière suivante :
- NbBitsMin a pour valeur la profondeur de couleur de l'image i.e. le logarithme à base 2 du nombre de couleurs.
- NbBitsMax a pour valeur 12.
- Quand le code 2^NbBitsMin est lu, alors la table doit être réinitialisée même si elle n'est pas pleine.
- Quand la table est pleine, elle ne doit pas être réinitialisée tant que le code précédent n'est pas lu.
- Quand le code 2^NbBitsMin+1 est lu, alors le flux Lzw est terminé.
La convention retenue par défaut par Up ! System est la suivante :
- NbBitsMin a pour valeur 9.
- NbBitsMax a pour valeur 12.
- Quand le code 2^NbBitsMin est lu, alors la table doit être réinitialisée même si elle n'est pas pleine.
- Quand la table est pleine, elle ne doit pas être réinitialisée tant que le code précédent n'est pas lu.
- Quand le code 2^NbBitsMin+1 est lu, alors le flux Lzw est terminé.
Exemple d'un flux compressé par l'algorithme Lzw
Flux non compressé
/* ------------------------------------------------------------------- */
/* Fichier : clientftp.upl */
/* Objet : Exemple d'emploi d'Up ! Network. */
/* */
/* Module : Up ! Application System. */
/* Auteur-Date : DUVAL Jean-Pierre - Novembre 2003. */
/* ------------------------------------------------------------------- */
/* Observations */
/* */
/* */
/* ------------------------------------------------------------------- */
Source Composant "Exemple d'emploi d'Up ! Network" Version 4.0.0;
ImporterModule
UpsFts(, ImporterDefinitions);
Variable
/******/
MonServeur : Nul Ou ServeurFtp;
Principal
/*******/
Debut
MonServeur=ServeurFtp("ftp://local:21");
MonServeur.ChangerConnexion("anonymous", "contact@mon-domaine.com");
MonServeur.ChangerEtatTypeDonnees(TypeDonneesAscii);
CopierFichier("C:/tmp2/essai.txt", "ftp://local:21/tmp/essai.txt");
MonServeur.ChangerEtatTypeDonnees(TypeDonneesImage);
CopierFichier("ftp://local:21/tmp/essai.doc", "C:/tmp2/essai.doc");
MonServeur=Nul;
Fin Principal
Flux compressé
00000000 178a 8402 d81c 120b 0683 c221 30a8 5c30 ....X.....B!0(\0
00000010 5a20 150b c150 0101 18d2 6334 1a4c a721 Z ..AP...Rc4.L'!
00000020 0470 403a 1018 cd91 9371 d0cc 7438 0b8e .p@:..M..qPLt8..
00000030 a703 6476 5b2e 97cc 2633 2884 4a02 4f31 '.dv[..L&3(.J.O1
00000040 1a8c a749 7c7c 8a78 329b 6566 5101 904f ..'I||.x2.efQ..O
00000050 4095 9bcd 3441 3954 e020 1088 09d3 a3b9 @..M4A9T` ...S#9
00000060 bce4 6b17 4cab 32d9 a44e b55e afd8 2c31 <dk.L+2Y$N5^/X,1
00000070 dae4 049a 6f32 1d4d 9439 747e 9b4f 1010 Zd..o2.M.9t~.O..
00000080 4e12 b8b1 84e8 6937 9b84 0533 c9cc e940 N.81.hi7...3ILi@
00000090 ac58 abd6 4b81 d6fc 7539 0b48 975a 1c7c ,X+VK.V|u9.H.Z.|
000000a0 8855 2b10 4982 0251 94c2 6e16 9423 2723 .U+.I..Q.Bn..#'#
000000b0 950e 1c4e 379d a806 2ce0 8064 3018 0cf0 ...N7.(.,`.d0..p
000000c0 1818 7c46 270d d7ec 363a fd64 d757 319b ..|F'.Wl6:}dWW1.
000000d0 9ce3 476b addc dc73 db60 b5b0 1e07 138b .cGk-\\s[`50....
000000e0 2e88 0836 bc6e 5f13 91b5 d974 3a3b 2da0 ...6<n_..5Yt:;-
000000f0 28a6 6fc3 98e8 6433 7d04 de73 cb4e c453 (&oC.hd3}.^sKNDS
00000100 ea3d aa97 e4a4 d2ed d50a 91d2 a956 1108 j=*.d$RmU..R)V..
00000110 0ad1 a39e f440 3117 0c85 c301 d828 1449 .Q#.t@1...C.X(.I
00000120 ee8e 4bf0 e4b3 2d0f 2814 8ea9 a398 8c93 n.Kpd3-.(..)#...
00000130 8501 e413 058e 01f0 5810 3fe3 82ab 0108 ..d....pX.?c.+..
00000140 8328 cc34 8dc3 4aec bc0e 614b f805 0ac3 .(L4.CJl<.aKx..C
00000150 08e4 348c 2312 d49a 8551 6c5a 88a3 ab30 .d4.#.T..QlZ.#+0
00000160 dc29 b743 2b0e 8f2a 2b48 4027 8eab d46a \)7C+..*+H@'.+Tj
00000170 c3c2 1118 a113 8dc3 18d2 380c 2364 5917 CB..!..C.R8.#dY.
00000180 45e0 5432 3130 a054 651a 0e4d 0b0e 1eca E`T210 Te..M...J
00000190 92b0 e508 0501 141e 9387 4178 5e36 0de3 .0e.......Ax^6.c
000001a0 1c92 1d06 4188 4511 3fb2 9c7e 3905 c218 ....A.E.?2.~9.B.
000001b0 d0cb 0ce8 d3b6 370d c328 f0de cbac b2f0 PK.hS67.C(p^K,2p
000001c0 3c8d aeb8 e611 4261 10c6 bc0e 8308 c63a <..8f.Ba.F<...F:
000001d0 0809 505b 43a8 2175 2135 bf93 74ab 1b4e ..P[C(!u!5?.t+.N
000001e0 1394 e88d 08b4 48e8 2a0f 2380 ca22 2f13 ..h..4Hh*.#.J"/.
000001f0 c8ca 3985 1505 4552 4f03 2d4e 208e 7230 HJ9...ERO.-N .r0
00000200 d336 3b63 8334 8aa2 ecd4 ba21 cc23 a282 S6;c.4."lT:!L#".
00000210 1905 f53b be34 85c3 a0f0 3a50 8104 bc38 ..u;>4.C p:P..<8
00000220 4153 04c5 324c c364 d018 85f5 f0e1 608e AS.E2LCdP..upa`.
00000230 761d 8b63 d292 92f1 2cd3 138c e637 4ea3 v..cR..q,S..f7N#
00000240 953a bad5 551d 4b57 5517 4d59 530e 6ff8 .::UU.KWU.MYS.ox
00000250 c33a d683 7d6c 8d57 08c2 352e cbe3 84c3 C:V.}l.W.B5.Kc.C
00000260 31cc b33c d36a a836 c5b4 324c b648 455e 1L3