La plupart des génériques des algorithmes de compression de travailler avec un un octet de granularité.
Considérons la chaîne suivante:
"XXXXYYYYXXXXYYYY"
- Une course-Longueur-algorithme de Codage va dire: "c'est 4 'X', 4 'Y', 4 'X', 4 'Y'"
- Un Lempel-Ziv algorithme va dire: "C'est la chaîne de caractères "XXXXYYYY", suivie par la même chaîne: donc, nous allons remplacer la 2e corde avec une référence à la 1ère."
- Un codage de Huffman algorithme va dire: "Il y a seulement 2 symboles dans cette chaîne, donc je ne peux utiliser qu'un seul bit par symbole."
Maintenant, nous allons coder notre chaîne en Base64. Voici ce que nous obtenons:
"WFhYWFlZWVlYWFhYWVlZWQ=="
Tous les algorithmes sont en train de dire: "Quel genre de gâchis, c'est qui?". Et ils ne sont pas susceptibles de comprimer cette chaîne très bien.
Pour rappel, en Base64 fonctionne essentiellement par le ré-encodage des groupes de 3 octets (0...255) en groupes de 4 octets (0...63):
Input bytes : aaaaaaaa bbbbbbbb cccccccc
6-bit repacking: 00aaaaaa 00aabbbb 00bbbbcc 00cccccc
Chaque octet de sortie est ensuite transformé en une version imprimable des caractères ASCII. Par convention, ces personnages sont (ici avec une marque tous les 10 caractères):
0 1 2 3 4 5 6
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Par exemple, notre exemple de chaîne commence avec un groupe de trois octets égal à 0x58 en hexadécimal (code ASCII du caractère "X"). Ou en binaire: 01011000. Nous allons appliquer le codage Base64:
Input bytes : 0x58 0x58 0x58
As binary : 01011000 01011000 01011000
6-bit repacking : 00010110 00000101 00100001 00011000
As decimal : 22 5 33 24
Base64 characters: 'W' 'F' 'h' 'Y'
Output bytes : 0x57 0x46 0x68 0x59
Fondamentalement, le modèle "3 fois l'octet 0x58" qui était évident dans l'original flux de données n'est pas évident de plus lors de l'encodage du flux de données parce que nous avons brisé les octets en 6 bits paquets et les mappé à nouveau octets qui semblent désormais être aléatoire.
Ou en d'autres termes: nous avons cassé l'origine alignement d'octets que la plupart des algorithmes de compression dépendent.
Quelle que soit la méthode de compression est utilisé, il a généralement un impact sévère sur l'algorithme de la performance. C'est pourquoi vous devriez toujours compresser d'abord et encoder de la seconde.
C'est encore plus vrai pour le chiffrement: compresser d'abord, chiffrer seconde.
MODIFIER - UNE note sur LZMA
Comme MSalters remarqué, LZMA -- qui xz est à l'aide de -- est de travailler sur les flux de bits plutôt que de flux d'octets.
Encore, cet algorithme ne souffrent également de l'encodage Base64 dans un chemin qui est essentiellement compatible avec ma description précédente:
Input bytes : 0x58 0x58 0x58
As binary : 01011000 01011000 01011000
(see above for the details of Base64 encoding)
Output bytes : 0x57 0x46 0x68 0x59
As binary : 01010111 01000110 01101000 01011001
Même en travaillant au niveau du bit, il est beaucoup plus facile de reconnaître un schéma de l'entrée binaire de la séquence que dans la sortie binaire de la séquence.