Travaux pratiques

encodage de texte

Durée :
3h
Objectif :
créer un programme d’encodage
Système d'exploitation :
Linux, Solaris ou Windows
Outils utilisés :
éditeur de texte, compilateur C/C++, machine virtuelle Java
Fichiers à voir :
aucun

Données du problème

Le but de ces travaux pratiques est de vous faire programmer une méthode d’encodage permettant de transférer des données sur un réseau de telle manière à ce qu’il n’y ait pas de pertes/transformations dues à des codages de caractères différents en fonction des parties traversées.

Nous allons donc transformer toute chaîne de caractères en une autre chaîne dont les caractères seront déterminés à partir de valeurs codées sur seulement 6 bits.

Nous voulons donc créer un programme qui lise le contenu d’un fichier dont le nom lui est passé en paramètre, encoder ce contenu et l’écrive sur la sortie standard.

Le choix du langage de programmation est libre (C, C++, Java, Python, ...)

Principe

Le processus d’encodage travaille sur une fenêtre de 24 bits (soit 3 octects, ou encore, 4 mots de 6 bits).

Ces 24 bits sont traités de la gauche vers la droite par groupes de 6 bits.

La valeur décimale représentée par ces groupes de 6 bits sert d’index dans une table de correspondance (voir ci-dessous) et c’est le caractère correspondant à cette valeur qui composera la chaîne résultat.

La fenêtre de 24 bits est déplacée dans le contenu du fichier pour que celui-ci soit traité dans son intégralité.

Comme la longueur d’un fichier n’est pas toujours multiple de 24 bits, il y a trois cas particuliers à envisager :

  1. La dernière fenêtre contient exactement 24 bits de données, auquel cas, rien de particulier n’est à faire.
  2. La dernière fenêtre ne contient que 8 bits de données. Dans ce cas, les bits non renseignés sont mis à 0 et la conversion est faite sur les 2 premiers mots de 6 bits. La chaîne résultat sera complétée par le groupe de caractères ==.
  3. La dernière fenêtre ne contient que 16 bits de données. Dans ce cas, les bits non renseignés sont mis à 0 et la conversion est faite sur les 3 premiers mots de 6 bits. La chaîne résultat sera complétée par le caractère =.
ValeurEncodageValeurEncodageValeurEncodage
0A23X46u
1B24Y47v
2C25Z48w
3D26a49x
4E27b50y
5F28c51z
6G29d520
7H30e531
8I31f542
9J32g553
10K33h564
11L34i575
12M35j586
13N36k597
14O37l608
15P38m619
16Q39n62+
17R40o63/
18S41p  
19T42q (pad)=
20U43r  
21V44s  
22W45t  

Exemples de conversions

Bonjour tout le mondeQm9uam91ciB0b3V0IGxlIG1vbmRl
BonjourQm9uam91cg==
Hello WorldSGVsbG8gV29ybGQ=

Exemple pas à pas

Nous prenons comme exemple la chaîne Bonjour qui comporte 7 caractères, soit 2×24+8 bits. Il faudra donc compléter la dernière fenêtre avec des 0 et ne convertir que les deux premiers mots de 6 bits.

Bonjour
  1. Bon
    • 66111110
    • 010000100110111101101110
    • 010000100110111101101110
    • 16386146
    • Qm9u
  2. jou
    • 106111117
    • 011010100110111101110101
    • 011010100110111101110101
    • 26386153
    • am91
  3. r  
    • 11400
    • 011100100000000000000000
    • 011100100000padpad
    • 2832padpad
    • cg==

Problèmes possibles

Vous allez manipuler des données au niveau bit, mais les types que vous utilisez sont en général stockés sur plus d’un octet. Faites donc attention à l’ordre des octets dans un mot ! Est-ce du big-endian ou du little-endian1 ? Les processeur Intel sont traditionnellement little-endian, c’est à dire qu’il stockent les octets d’un mot dans le sens inverse de ce que l'on aurait tendence à imaginer.

En général, un éditeur de texte ajoute automatiquement une ligne vide à la fin d’un fichier quand il le sauvegarde. Ceci pose problème, il faut donc être capable de dire à son éditeur de ne pas rajouter cette ligne vide2.

Conclusion

Nous n'avons abordé ici que le processus d'encodage. Les opérations de décodage se font dans l'ordre inverse. Vous en aurez certainement besoin pour lire le reste de cette concusion (à copier-coller sur une même ligne et sans espaces) ...

Q2V0dGUgbcOpdGhvZGUgZXN0IGJpZW4gY29ubnVlIGV0IGVmZmVjdGl2ZW1
lbnQgdXRpbGlzw6llIHBvdXIgdHJhbnNmw6lyZXIgZGVzIGRvbm7DqWVzID
ogYydlc3QgbGUgY29kYWdlIGJhc2U2NC4KClZvdXMgcG91cnJleiBlbiBhd
m9pciB1bmUgZGVzY3JpcHRpb24gY29tcGzDqHRlIHN1ciBsYSBwYWdlIFdp
a2lwZWRpYSBjb3JyZXNwb25kYW50ZSA6IGh0dHA6Ly9mci53aWtpcGVkaWE
ub3JnL3dpa2kvQmFzZTY0CgpNYWlzIHNpIHZvdXMgbGlzZXogY2VjaSwgYy
dlc3QgcXVlIHZvdXMgw6p0ZXMgcGFydmVudSDDoCBjb2RlciB2b3VzIG3Dq
m1lIGNldHRlIG3DqXRob2RlICEgRsOpbGljaXRhdGlvbnMgIQoK

  1. [] : http://fr.wikipedia.org/wiki/Big-endian
  2. [] : Une méthode pour écrire un fichier sans ligne vide à la fin vous est proposée sur cette page.