# Uuencode

Les programmes uuencode et son symétrique uudecode sont des programmes de conversion de données binaires en texte, disponibles sur la quasi-totalité des systèmes Unix/Linux, ils permettent de convertir sans dégradation des données binaires en vue de leur transmission via un support qui ne le permettrait pas normalement. Ces deux programmes et l'algorithme qu'ils implémentent ont été portés sur un très grand nombre de systèmes d'exploitation. Le nom uuencode vient de Unix to Unix Encoding.

## Histoire

Ces deux programmes ont été écrits avant l'utilisation massive d'Internet afin en particulier que la suite logicielle uucp puisse transporter de manière fiable des fichiers binaires. Cette suite logicielle permet des communications inter-serveurs via modem et était initialement conçue pour échanger du texte simple (en n'utilisant qu'une partie des 128 caractères ASCII).
Ils ont été principalement utilisés pour la transmission de messages (courrier électronique et forums Usenet) mais aujourd'hui leur utilisation est largement remplacée par les extensions MIME et en particulier l'encodage base64 (qui emploie un jeu de caractères plus portable dans le flux encodé).

## Principe de fonctionnement

Le programme uuencode produit un flux de texte (une succession de caractères ASCII) dont la première ligne est :
où <mode> et <nom> sont remplacés respectivement par la valeur octale représentant les droits d'accès à placer sur le fichier décodé et par le nom du fichier à construire lors du décodage. Le flux de données encodées se termine par une ligne contenant juste le texte :
Entre ces deux lignes seuls les 65 caractères suivants peuvent être rencontrés :
le caractère noté es ci-dessus est le caractère ASCII représentant une espace et dont le code numérique est 32. Les autres caractères portent les codes numériques allant de 32+1 à 32+64.
Le programme d'encodage lit le fichier d'origine par groupe de trois octets (éventuellement complété par des octets de valeur nulle si le nombre d'octets à encoder n'est pas multiple de 3), puis convertit ces trois octets (soit 24 bits) en quatre groupes de 6 bits chacun, ensuite à chaque groupe de 6 bits (qui représente en base 10 un nombre compris entre 0 et 63) est ajoutée la valeur 32, la valeur résultante est alors le code ASCII de l'un des caractères présentés plus haut, ce caractère est employé par l'encodeur dans le flux de sortie.
Le programme d'encodage ajoute également, au tout début de chaque ligne de texte produit, le compte de caractères/octets codés dans cette ligne ; ce décompte (allant de 1 à 45) est lui-même encodé en l'augmentant de 32 avant d'être converti en un caractère ASCII à son tour. La taille limite autorisée des lignes produites est donc de 61 caractères (soit 1 caractère pour la longueur initiale plus 60 caractères codant 45 octets)

## Exemple

Cet exemple sert à illustrer le fonctionnement de l'encodage ; cependant comme les octets à encoder représentent ici les codes ASCII d'un texte, il n'y aurait aucune utilité à utiliser uuencode dans ce cas. Le texte utilisé en exemple est « Oh! » :
| Texte | O | O | O | O | O | O | O | O | h | h | h | h | h | h | h | h | ! | ! | ! | ! | ! | ! | ! | ! |
| Octets à encoder (0 à 255 et en base 10) | 79 | 79 | 79 | 79 | 79 | 79 | 79 | 79 | 104 | 104 | 104 | 104 | 104 | 104 | 104 | 104 | 33 | 33 | 33 | 33 | 33 | 33 | 33 | 33 |
| Convertits en bits (base 2) | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
| Valeur décimale de chaque groupe de 6 bits (0 à 63) | 19 | 19 | 19 | 19 | 19 | 19 | 54 | 54 | 54 | 54 | 54 | 54 | 32 | 32 | 32 | 32 | 32 | 32 | 33 | 33 | 33 | 33 | 33 | 33 |
| +32 | 51 | 51 | 51 | 51 | 51 | 51 | 86 | 86 | 86 | 86 | 86 | 86 | 64 | 64 | 64 | 64 | 64 | 64 | 65 | 65 | 65 | 65 | 65 | 65 |
| Caractère produit par l'encodage | 3 | 3 | 3 | 3 | 3 | 3 | V | V | V | V | V | V | @ | @ | @ | @ | @ | @ | A | A | A | A | A | A |
L'encodage produisant ici exactement quatre octets (et 3+32=35 soit le code ASCII du caractère #) le texte émis par l'encodeur est donc :