Encodages

BIEN avant la popularisation d’Internet, les communications étaient moins sûres et les fichiers «binaires» devaient être codés avec des octets imprimables, ce que permettent uuencode et base64

de 256 à 64

La technique utilisée est de diviser les 24 bits de trois octets (huit bits) en quatre caractères ASCII («hexets» de six bits)

xxxxxxxx xxxxxxxx xxxxxxxx
xxxxxxxx xxxxxxxx xxxxxxxx

Par exemple, les trois octets codant la chaîne Bye sont 65, 121 et 101, soit en binaire : 01000001, 01111001 et 01100101

01000001 01111001 01100101

Redécoupé en quatre parties, nous obtenons quatre nouveaux nombres binaires :

01000001 01111001 01100101

soit les nombres décimaux 16, 23, 37 et 37 (ce codage gonfle les données de 4 /3). De là, il y a deux familles d’encodages possibles :

base64

Les 26 premiers nombres (0-25) utilisent les caractères latins majuscules, de rang 65 à 90, les 26 suivants (26-51) les caractères latins minuscules de rang 97-122, les 10 suivant (52-61) les chiffres décimaux (48-57) et les deux dernières valeurs, 62 et 63, sont codées avec + et /

ABCDEFGHIJKLMNOP
0123456789101112131415
QRSTUVWXYZabcdef
16171819202122232425262728293031
ghijklmnopqrstuv
32333435363738394041424344454647
wxyz0123456789+/
48495051525354555657585960616263

Il faut théoriquement un nombre d’octets divisible par trois. Si ce n’est pas le cas, on complète avec des octets nuls. Après transformation, les éventuels hexets nuls sont codés avec le signe =.

Notes :+ et / n’étant pas compatibles avec les adresses URL, il existe une norme alternative qui remplace + (62) par - et / (63) par _

Utilité

Cet encodage permet l’inclusion d’une image dans le code d’une page HTML :

<img src="data:image/png;base64,
[codage]
">

En Unix, la commande base64 permet d’encoder et de décoder de tels fichiers :

base64 fichier.png > fichier-codé encode un fichier en base64, utilisable avec <img src="">

base64 -d fichier-codé > fichier-restauré décode un fichier codé en base64

En python, voir le module binascii.

uu__code

Une autre façon d’encoder est plus simple, parce que les nombres de 0 à 63 suivent l’ordre ASCII de 32 à 95 (` remplace souvent l’espace). Il suffit donc d’ajouter 32 aux nombres représentés par les hexets.

`!"#$%&()*+,-./
0123456789101112131415
0123456789:;<=>?
16171819202122232425262728293031
@ABCDEFGHIJKLMNO
32333435363738394041424344454647
PQRSTUVWXYZ[\]^_
48495051525354555657585960616263

Les données d’un tel fichier comporte la structure :

begin droits nom-de-fichier

[codage]

begin

De plus, chaque ligne doit commencer par une déclaration du nombre d’octets encodés + 32. C’est souvent M, ASCII 77, qui code donc pour 45 octets, soit 60 hexets et donc 60 caractères de code.

uuencode

En Unix, il suffit de saisir

uuencode fichier-à-traduire nom-du-fichier-à-décoder-dans-le-futur > fichier-à-produire

Par défaut, les droits du fichier à produire sont fixé 644.

begin 644 fichier-à-décoder

 [codage uu]

end

Le drapeau -m permet un encodage base64, tout en conservant la première et la dernière ligne :

uuencode fichier-initial fichier-à-décoder > fichier-à-produire

Le fichier produit a cette structure

begin-base64 644 fichier-à-décoder

 [codage base64]

end

uuencode

Pour décoder, quel que soit le mode de de uuencode :

uudecode fichier-produit

En python, voir le module binascii.

Octets en deux caractères

Chaque octet (8 bits) peut être décomposé en quartets (4 bits), qui ne prennent qu’un chiffre hexascimal de 0 à 9 et A (10) à F (15).

En python, voir le module binascii.