uuencoding est une forme de codage binaire-texte qui trouve son origine dans les programmes Unix uuencode et uudecode écrits par Mary Ann Horton à l' Université de Californie à Berkeley en 1980, pour coder des données binaires pour la transmission dans les systèmes de messagerie électronique .
Le nom "uuencoding" est dérivé de Unix-to-Unix Copy , c'est-à-dire que "l'encodage Unix-to-Unix" est un encodage sûr pour le transfert de fichiers arbitraires d'un système Unix à un autre système Unix mais sans garantie que les liens intermédiaires soient tous des systèmes Unix. Étant donné qu'un message électronique peut être transmis via ou vers des ordinateurs avec des jeux de caractères différents ou via des transports qui ne sont pas propres à 8 bits , ou gérés par des programmes qui ne sont pas propres à 8 bits, la transmission d'un fichier binaire par courrier électronique peut entraîner sa corruption. En codant ces données dans un sous-ensemble de caractères commun à la plupart des jeux de caractères, la forme codée de ces fichiers de données n'était pas susceptible d'être "traduite" ou corrompue, et arriverait ainsi intacte et inchangée à la destination. Le programme uudecode inverse l'effet d' uuencode , en recréant exactement le fichier binaire d'origine. uuencode/decode est devenu populaire pour l'envoi de fichiers binaires (et surtout compressés) par courrier électronique et la publication sur des groupes de discussion Usenet , etc.
Il a maintenant été largement remplacé par MIME et yEnc . Avec MIME, les fichiers qui auraient pu être codés en Uu sont désormais transférés avec l'encodage Base64 .
Format codé
Un fichier UUEncodé commence par une ligne d'en-tête du type :
début <mode> <fichier><nouvelle ligne>
<mode>correspond aux permissions de fichier Unix du fichier sous forme de trois chiffres octaux (par exemple 644, 744). Cela n'est généralement significatif que pour les systèmes d'exploitation de type Unix .
<file>est le nom du fichier à utiliser lors de la recréation des données binaires.
<newline>signifie un caractère de nouvelle ligne , utilisé pour terminer chaque ligne.
Chaque ligne de données utilise le format :
<caractère de longueur><caractères formatés><nouvelle ligne>
<length character>est un caractère indiquant le nombre d'octets de données qui ont été codés sur cette ligne. Il s'agit d'un caractère ASCII déterminé en ajoutant 32 au nombre d'octets réel, à la seule exception d'un accent grave "`" (code ASCII 96) signifiant zéro octet. Toutes les lignes de données, à l'exception de la dernière (si la longueur des données n'était pas divisible par 45), ont 45 octets de données codées (60 caractères après codage). Par conséquent, la grande majorité des valeurs de longueur sont 'M', (32 + 45 = code ASCII 77 ou "M").
<formatted characters>sont des caractères codés. Voir § Mécanisme de formatage pour plus de détails sur l'implémentation réelle.
Le fichier se termine par deux lignes :
`<nouvelle ligne> fin<nouvelle ligne>
L'avant-dernière ligne est également un caractère indiquant la longueur de la ligne, l'accent grave signifiant zéro octet.
En tant que fichier complet, la sortie uuencodée pour un fichier texte brut nommé cat.txt contenant uniquement les caractères Cat serait
début 644 cat.txt #0V%T ` fin
La ligne de début est un en-tête uuencode standard ; le « # » indique que sa ligne encode trois caractères ; les deux dernières lignes apparaissent à la fin de tous les fichiers uuencodés.
Mécanisme de formatage
Le mécanisme uuencodingrépète ce qui suit tous les 3 octets, en les codant en 4 caractères imprimables, chaque caractère représentant un chiffre numérique de base 64 :
- Commencez avec 3 octets de la source, 24 bits au total.
- Divisé en 4 groupes de 6 bits, chacun représentant une valeur comprise entre 0 et 63 : bits (00-05), (06-11), (12-17) et (18-23).
- Ajoutez 32 à chacune des valeurs. Avec l'ajout de 32, cela signifie que les résultats possibles peuvent être compris entre 32 (« » espace) et 95 (« _ » soulignement ). 96 (« ` » accent grave ) comme « caractère spécial » est une extension logique de cette plage. Bien que le caractère espace soit documenté comme le codage pour la valeur 0, les implémentations, telles que GNU sharutils, utilisent en fait le caractère accent grave pour encoder également les zéros dans le corps du fichier, sans jamais utiliser d'espace.
- Affichez l’équivalent ASCII de ces nombres.
Si la longueur de la source n'est pas divisible par 3, la dernière section de 4 octets contiendra des octets de remplissage pour la rendre proprement divisible. Ces octets sont soustraits de la ligne <length character>afin que le décodeur n'ajoute pas de caractères indésirables au fichier.
uudecodingest l'inverse de ce qui précède, soustrayez 32 du code ASCII de chaque caractère ( modulo 64 pour tenir compte de l'utilisation de l'accent grave) pour obtenir une valeur de 6 bits, concaténez 4 groupes de 6 bits pour obtenir 24 bits, puis affichez 3 octets.
Le processus de codage est illustré par ce tableau, qui montre la dérivation du codage ci-dessus pour « Cat ».
tableau uuencode
Le tableau suivant montre la conversion de la valeur décimale des champs de 6 bits obtenus pendant le processus de conversion et leur code de sortie de caractère ASCII et caractère correspondant.
Notez que certains encodeurs peuvent produire un espace (code 32) au lieu d'un accent grave (« ` », code 96), tandis que certains décodeurs peuvent refuser de décoder les données contenant un espace.
Exemple
Voici un exemple de codage UUEncodage d'un fichier texte d'une seule ligne. Dans cet exemple, %0D est la représentation en octets de carriage return et %0A est la représentation en octets de line feed .
- déposer
Nom du fichier = wikipedia-url.txt Contenu du fichier = http://www.wikipedia.org%0D%0A
- codage uu
début 644 wikipedia-url.txt ::'1T<#HO+W=W=RYW:6MI<&5D:6$N;W)G#0H` ` fin
Forks (fichier, ressource)
Unix possède traditionnellement une seule branche dans laquelle les données des fichiers sont stockées. Cependant, certains systèmes de fichiers prennent en charge plusieurs branches associées à un seul fichier. Par exemple, le système de fichiers hiérarchique Mac OS (HFS) classique prenait en charge une branche de données et une branche de ressources . Mac OS HFS+ prend en charge plusieurs branches, tout comme les flux de données alternatifs Microsoft Windows NTFS . La plupart des outils d'uucoding ne gèrent que les données de la branche de données principale, ce qui peut entraîner une perte d'informations lors de l'encodage/décodage (par exemple, les commentaires des fichiers Windows NTFS sont conservés dans une branche différente). Certains outils (comme l'application Mac OS classique UUTool ) ont résolu le problème en concaténant les différentes branches dans un seul fichier et en les différenciant par nom de fichier.
Relation avec xxencode, Base64 et Ascii85
Malgré leur gamme limitée de caractères, les données codées en Uu sont parfois corrompues lors de leur transmission sur certains ordinateurs utilisant des jeux de caractères non-ASCII tels que EBCDIC . Une tentative pour résoudre le problème a été le format xxencode, qui n'utilisait que des caractères alphanumériques et les symboles plus et moins. Le format Base64, plus courant aujourd'hui, est basé sur le même concept de caractères uniquement alphanumériques par opposition à ASCII 32-95. Les trois formats utilisent 6 bits (64 caractères différents) pour représenter leurs données d'entrée.
Base64 peut également être généré par le programme uuencode et son format est similaire, à l'exception de la traduction réelle des caractères :
L'en-tête est modifié en
begin-base64 <mode> <fichier>
la remorque devient
====
et les lignes entre sont codées avec des caractères choisis parmi
ABCDEFGHIJKLMNOP QRSTUVWXYZabcdef ghijklmnopqrstuv wxyz0123456789+/
Une autre alternative est Ascii85 , qui encode quatre caractères binaires en cinq caractères ASCII. Ascii85 est utilisé dans les formats PostScript et PDF .
Inconvénients
uuencoding prend 3 octets préformatés et les transforme en 4 et ajoute également des balises de début/fin, un nom de fichier et des délimiteurs . Cela ajoute au moins 33 % de surcharge de données par rapport à la source seule, bien que cela puisse être au moins quelque peu compensé en compressant le fichier avant de l'uuencoder.
Assistance en langues
Python
Le langage Python prend en charge l'encodage uu en utilisant le module codecs avec le codec « uu » :
Pour Python 2 (obsolète/disparu à compter du 1er janvier 2020) :
$ python -c 'print "Cat".encode("uu")' début 666 <données> # 0V%T fin $
Pour Python 3 où le module codecs doit être importé et utilisé directement :
$ python3 -c "à partir des codecs importer encoder;print(encode(b'Cat', 'uu'))" b'begin 666 <données> #0V%T end ' $
Pour décoder, passez le fichier entier :
$ python3 -c "à partir des codecs importer décoder;print(decode(b'begin 666 <données> #0V%T end ', 'uu'))" b'Cat'
Perl
Le langage Perl prend en charge nativement l'encodage uuencoding à l'aide des opérateurs pack() et unpack() avec la chaîne de format « u » :
$ perl -e 'print pack("u","Chat")' # 0V%T
Le décodage base64 avec unpack peut également être réalisé en traduisant les caractères :
$ perl -e 'print unpack("u","#0V%T")' Chat
Pour produire des fichiers uuencodés bien formés, vous devez utiliser des modules, ou un peu plus de code :
Encoder (oneliner)
$ perl -ple 'BEGIN{utiliser Fichier::Basename;$/=undef;$sn=basename($ARGV[0]);} $_= "begin 600 $sn ".(pack "u", $_)."` end" si $_' /some/file/to_encode.gz
Encoder/Décoder (scripts Perl appropriés)
https://metacpan.org/dist/PerlPowerTools/view/bin/uuencode
https://metacpan.org/dist/PerlPowerTools/view/bin/uudecode