Deflate

Algorithme utilisé par Up ! System

L'algorithme Deflate est une combinaison de la méthode Lempel et Ziv de 1977 (LZ77) et de celle d'Huffman. Il est du à l'Internet Engineering Task Force (IETF).

Il s'agit de l'algorithme le plus efficace à ce jour nonobstant la typologie du flux à compresser.

Cet algorithme est une norme étant donné que chaque paramètre des méthodes sont fixés par des constantes.

De nombreuses applications, standards ou normes utilisent cet l'algorithme. Par exemple, les commandes compress, gzip, pkzip ou les images au format Portable Network Graphic (PNG).

Méthode LZ77

L'algorithme mis au point par les mathématiciens Lempel et Ziv en 1977 (LZ77) 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 dans une fenêtre glissante sur le flux se terminant à la position courante dans le flux.

La répétition est caractèrisée par un couple (Distance, Longueur) où :

La taille minimale d'une suite d'octets se répétant est trois octets. La taille minimale d'un codage d'une suite d'octets est 9 bits. La taille minimale du codage d'un octet n'appartenant à aucune suite est 9 bits.

Le codage en bits le plus simple possible est le suivant :

Algorithme Deflate

L'algorithme Deflate est paramétré avec les valeurs suivantes :

Au lieu d'utiliser un codage simple pour reconnaître les répétitions, les distances et les longueurs, deux encodages Huffman sont utilisés.

Ces encodages Huffman ont des caractéristiques particulières :

Il en résulte que, connaissant les longueurs de codes pour chaque valeur, il est possible de calculer les codes correspondants.

Un flux compressé par la méthode Deflate est découpé en tronçons, de taille variable, pouvant être compressé ou non.

Les premiers bits formant l'en-tête du bloc indiquent leur nature :

Bloc non compressé

La lecture du flux est recalé sur un octet entier. Les bits résiduels de l'octet en cours de lecture sont donc ignorés.

Le format d'un bloc non compressé est le suivant :

Bloc compressé avec les tables de statistiques Huffman par défaut

Pour les littéraux et les longueurs, étant donné qu'il existe 256 valeurs à distiguer plus une pour savoir s'il s'agit d'un littéral ou d'une longueur, le codage Huffman normalisé devrait comporter de 1 à 257 bits soit plus de 32 octets !

Aussi, un codage spécial est employé :

Pour les distances, étant donné qu'il existe 32768 valeurs à distiguer, le codage Huffman normalisé devrait comporter de 1 à 32768 bits soit plus de 4096 octets !

Aussi, un codage par plage est également employé :

Code.Taille du code
en nombre de bits.
Distance.Nombre de bits
du complément.
0510
1520
2530
3540
455 à 61
557 à 81
659 à 122
7513 à 162
8517 à 243
9525 à 323
10533 à 484
11549 à 644
12565 à 965
13597 à 1285
145129 à 1926
155193 à 2566
165257 à 3847
175385 à 5127
185513 à 7688
195769 à 10248
2051025 à 15369
2151537 à 20489
2252049 à 307210
2353073 à 409610
2454097 à 614411
2556145 à 819211
2658193 à 1228812
27512289 à 1638412
28516385 à 2457613
29524577 à 3276813

Le format d'un bloc compressé avec les tables par défaut est le suivant :

Bloc compressé avec des tables de statistiques Huffman par défaut

Pour construire les tables Huffman, seules les longueurs de codes sont utiles pour chaque valeur avec le nombre maximal de valeurs. Elles sont encodées en utilisant également une table Huffman.

Le format d'un bloc compressé avec les tables spécifiques est le suivant :

Le reste du format d'un bloc compressé est identique à celui de la section précédente.

Exemple d'un flux compressé par l'algorithme Deflate

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 abeb 4a0b abab a044 1091 2136 25a8 e250 +kJ.++ D..!6%(bP 00000010 84a0 b4be 7405 8976 9993 9899 95a2 5050 . 4>t..v....."PP 00000020 5050 6a50 939c 9995 9ea4 96a4 a05e a5a0 PPjP.....$.$ ^% 00000030 9c04 8408 618b 1253 e20c 8462 5fe4 a6a5 ....a..Sb..b_d&% 00000040 6902 2035 283a d44a ced0 4e4a a84a 2b82 i. 5(:TJNPNJ(J+. 00000050 2e7e 6409 885a 0505 1507 e95a 4a79 fa29 .~d..Z....iZJyz) 00000060 b5e1 3262 44fd b913 5726 fb3f 294a 05c2 5a2bD}9.W&{?)J.B 00000070 8572 80dc 0b8d 0504 e4cc 9c8d 24cc fcf2 .r.\....dL..$L|r 00000080 841d 4d1d 24ac e896 b8c1 2162 1c69 6925 ..M.$,h.8A!b.ii% 00000090 6968 975d 2469 2540 b10e 90b0 ce2f 8a0f ih.]$i%@1..0N/.. 000000a0 52b2 33cb b000 60f2 8a55 4175 41fa 7e9a R23K0.`r.UAuAz~. 000000b0 5676 4809 a626 0606 312a 6482 3124 8c5d VvH.&&..1*d.1$.] 000000c0 0973 b27f 92a3 95a2 a606 f8a8 c4ea 0988 .s2..#."&.x(Dj.. 000000d0 d870 5024 98a2 4a0a 4ea0 e7e9 68a4 e554 XpP$."J.N gih$eT 000000e0 1ce7 e768 27e8 e467 a914 1484 d253 aa4a .ggh'hdg)...RS*J 000000f0 10d2 b454 60a4 40c2 bcc4 bcc0 d674 74f2 .R4T`$@B<D<@Vttr 00000100 0575 4549 2b44 1649 e740 5d24 2d05 1bb5 .uEI+D.Ig@]$-..5 00000110 2502 c360 42db 9714 0328 dd25 65a6 67a6 %.C`B[...(]%e&g& 00000120 41c3 e2c8 15d4 348d 14cc 8c94 e4a8 17a2 ACbH.T4..L..d(." 00000130 b4b4 044b e097 8fb3 f3d0 6062 880c 9480 44.K`..3sP`b.... 00000140 c935 fa96 7141 fe95 402a 0016 300a d602 I5z.qA~.@*..0.V. 00000150 8a66 7a4e 6682 4670 32d8 0add d256 4a96 .fzNf.Fp2X.]RVJ. 00000160 90e8 42e9 b442 c561 4823 866a 5f5f 9c9f .hBi4BEaH#.j__.. 00000170 9391 9c6a 6261 5204 de08 562f 39cc 48cf ...jbaR.^.V/9LHO 00000180 4bca d139 cfcf 4f4a d401 738b 0a52 33d3 KJQ9OOOJT.s..R3S 00000190 f3d5 33b3 f4b4 6a4b 8a0a 5273 f3d4 9232 sU33t4jK..RssT.2 000001a0 748e 14b4 0bb2 6060 a178 0900 9811 2760 t..4.2``!x....'` 000001b0 1d69 2469 212a 6825 5d01 3112 b46b 0240 .i$i!*h%].1.4k.@ 000001c0 6dc6 8e4e 6664 0ad1 ce7e 800c c542 d0b2 mF.Nfd.QN~..EBP2 000001d0 b0a4 e6d4 bf49 3b40 c4bf 2b47 4723 32bd 0$fT?I;@D?+GG#2= 000001e0 4951 4809 af12 675e 0946 240a 2196 ede6 IQH./.g^.F$.!.mf 000001f0 7646 5e54 49db b131 69a5 27e4 c138 9123 vF^TI[11i%'dA8.# 00000200 73c0 9104 89bb 6d03 13cd 674e d333 ca02 s@...;m..MgNS3J. 00000210 224c e800 "Lh.