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 /
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Q | R | S | T | U | V | W | X | Y | Z | a | b | c | d | e | f |
16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v |
32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |
w | x | y | z | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | + | / |
48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
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.
` | ! | " | # | $ | % | & | ’ | ( | ) | * | + | , | - | . | / |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
@ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |
P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
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.