é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 :
La dernière fenêtre contient exactement 24 bits de données, auquel cas, rien de particulier n’est à faire.
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 ==.
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 =.
Valeur
Encodage
Valeur
Encodage
Valeur
Encodage
0
A
23
X
46
u
1
B
24
Y
47
v
2
C
25
Z
48
w
3
D
26
a
49
x
4
E
27
b
50
y
5
F
28
c
51
z
6
G
29
d
52
0
7
H
30
e
53
1
8
I
31
f
54
2
9
J
32
g
55
3
10
K
33
h
56
4
11
L
34
i
57
5
12
M
35
j
58
6
13
N
36
k
59
7
14
O
37
l
60
8
15
P
38
m
61
9
16
Q
39
n
62
+
17
R
40
o
63
/
18
S
41
p
19
T
42
q
(pad)
=
20
U
43
r
21
V
44
s
22
W
45
t
Exemples de conversions
Bonjour tout le monde
→
Qm9uam91ciB0b3V0IGxlIG1vbmRl
Bonjour
→
Qm9uam91cg==
Hello World
→
SGVsbG8gV29ybGQ=
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.
B
o
n
j
o
u
r
B
o
n
66
111
110
01000010
01101111
01101110
010000
100110
111101
101110
16
38
61
46
Q
m
9
u
j
o
u
106
111
117
01101010
01101111
01110101
011010
100110
111101
110101
26
38
61
53
a
m
9
1
r
114
0
0
01110010
00000000
00000000
011100
100000
pad
pad
28
32
pad
pad
c
g
=
=
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) ...