Représentation des nombres et caractères 1 Conversion de bases

Univ. Lille 1 - Licence Informatique 2ème année 2016-2017
Codage de l’information
Représentation des nombres et caractères
Objectifs du TP Ce TP a pour but
1. d’étudier la programmation des conversions entiers <-> chaînes de caractères ;
2. d’étudier la représentation des nombres flottants ;
3. et d’étudier la représentation des caractères ISO-8859-1 et UTF-8.
Outils utilisés
le langage Python ;
le programme iconv ;
le programme diff
La documentation des différentes fonctions à réaliser est disponible à l’adressehttp://www.fil.univ-lille1.fr/~salson/codage/TP/TP-Nombres-caracteres/Doc/index.html.
1 Conversion de bases
Il s’agit dans cette partie de réaliser des fonctions permettant de convertir des entiers décimaux
dans n’importe quelle base.
Python offre déjà certaines possiblités de conversion que nous allons commencer par essayer.
1.1 Impression des entiers avec print
Tous les langages de programmation offrent au programmeur la possibilité d’imprimer les nombres
entiers. Python n’échappe pas à la règle, avec la procédure print.
>>> print (31415)
31415
La procédure print imprime l’entier 31415 en base décimale.
Il est aussi possible de demander à la procédure print d’imprimer les entiers en base 8 ou en base
16. Il faut pour cela utiliser la méthode format de la classe str. Par exemple pour transformer un
entier en une chaîne contenant la représentation hexadécimal, on utilisera "{:x}".format(31415).
>>> print ("{: x}".format(31415))
7 ab7
Question 1 Imprimez les entiers de votre choix avec la procédure print et les formats d’impression {:x},
{:o},{:X}. Expliquez la différence entre chacun de ces formats.
Python dispose aussi des fonctions bin,oct,hex qui prennent en paramètre un entier et qui
retournent une chaîne de caractères correspondant respectivement à la représentation binaire, octale
et hexadécimale de l’entier.
Question 2 Convertissez l’entier 1331 en utilisant chacune de ces trois fonctions.
1
On se propose maintenant d’écrire des fonctions pour convertir un entier dans n’importe quelle
base.
1.2 Transformer un entier en un chiffre
Question 3 Que vaut l’expression chr(ord(’0’) + n)lorsque nest un entier compris entre 0 et 9 ? et si
n10 ?
Question 4 Si ndésigne un entier compris entre 10 et 15 inclus, quelle expression, dépendant de net
utilisant les deux fonctions chr et ord, donne un caractère compris entre ’A’ et ’F’ avec la correspondance
10 -> ’A’, . . . , 15 -> ’F’ ?
Question 5 Réalisez une fonction nommée integer_to_digit qui pour un entier compris entre 0 et 15
renvoie le chiffre hexadécimal correspondant (sous forme de caractère).
Voici des exemples de sortie de votre fonction integer_to_digit.
>>> in teger_to_di gi t (15)
F ’
>>> in teger_to_di gi t (0)
0 ’
Notez qu’il serait particulièrement judicieux d’intégrer ces exemples dans la documentation de votre
fonction Python. Faîtes-le également quand aucun exemple n’est fourni. Dans ce cas c’est à vous d’abord
de calculer le résultat attendu par la fonction, puis de coder votre fonction.
Notez également à toujours tester que les paramètres fournis remplissent les conditions attendues à
l’aide de la fonction assert.
1.3 Convertir un entier en une chaîne de caractères
Question 6 Réalisez une fonction nommée integer_to_string qui pour deux entiers net brenvoie l’écri-
ture de l’entier nen base b.
Question 7 Utilisez la fonction que vous venez de réaliser, ainsi que la procédure print avec les seuls
formats {:d} et {:s} (impression de chaînes), pour afficher sous forme d’un tableau les écritures décimales,
binaires, octales et hexadécimales des entiers de 0 à 20.
L’affichage doit avoir la forme
0 : 0 0 0
1 : 1 1 1
2 : 10 2 2
3 : 11 3 3
4 : 100 4 4
5 : 101 5 5
2
6 : 110 6 6
7 : 111 7 7
8 : 1000 10 8
9 : 1001 11 9
10 : 1010 12 A
11 : 1011 13 B
12 : 1100 14 C
13 : 1101 15 D
14 : 1110 16 E
15 : 1111 17 F
16 : 10000 20 10
17 : 10001 21 11
18 : 10010 22 12
19 : 10011 23 13
20 : 10100 24 14
2 Opérations logiques sur les entiers
2.1 Les opérateurs logiques sur les entiers en Python
Les opérateurs logiques sur les entiers sont prédéfinis en Python.
&: opération et bit à bit.
|: opération ou bit à bit.
^: opération ou exclusif bit à bit.
~: opération non bit à bit.
<< : décalage à gauche.
>> : décalage à droite.
Question 8 Testez chacun de ces opérateurs dans un interpréteur du langage.
Question 9 Quelle est la signification arithmétique de l’opération logique n << 1 ? Et de n >> 1 ?
Question 10 Réalisez une fonction deux_puissance qui prend en paramètre un entier n0et qui renvoie
la valeur de 2nen utilisant uniquement un opérateur logique.
Question 11 Comment avec les opérations logiques peut-on tester si un entier est pair ?
2.2 Conversion en base 2
Il s’agit ici de se concentrer sur la conversion d’un entier en une chaîne binaire et réciproquement.
Question 12 Sans utiliser d’opérateurs arithmétiques, réalisez la fonction integer_to_binary_str qui
renvoie l’écriture binaire (sous forme de chaîne de caractère) de l’entier passé en paramètre.
3
Question 13 Sans utiliser d’opérateurs arithmétiques, réalisez la fonction binary_str_to_integer qui à
partir d’une écriture binaire renvoie l’entier qui lui correspond.
3 Représentation des flottants
Dans un interpréteur Python, importez le module struct. Tapez l’instruction bytes_stored = struct.pack(’>f’, 3.5).
Cette instruction a pour effet de créer un objet de type bytes qui contient la représentation sous
forme de 4 octets du réel 3,5.
Il est possible d’accéder à chacun des octets de la même manière que dans une liste.
Question 14 Réalisez une fonction byte_to_binary qui prend en paramètre un octet qui renvoie sa repré-
sentation binaire sur 8 bits.
Question 15 Faîtes une fonction float_to_bin qui prenne en paramètre un réel et qui renvoie une chaîne
binaire correspondant au réel stocké. Cette fonction utilisera bien entendu la méthode struct.pack.
Exemple :
>>> fl oa t_ to _b in (3.5)
01000000011000000000000000000000
Nous allons maintenant voir l’impact d’un changement de bit dans un réel.
Question 16 Pour cela nous allons commencer par faire une fonction change_a_bit qui prend en paramètre
une chaîne binaire et qui renvoie une chaîne binaire dans laquelle, à la position donnée en paramètre, le
caractère, qui représente un bit, a été remplacé par le bit inverse.
Question 17 Réalisez une fonction binary_to_bytes qui prend une chaîne binaire en entrée et qui la
convertit, 8 bits par 8 bits, en une liste d’entiers.
>> > b in ar y_ to _b yt e s ( 110101101101011111011000)
[214 , 215 , 216]
Question 18 Faîtes une fonction change_a_bit_in_float qui prend en paramètre un réel ainsi que la
position à modifier dans la représentation binaire et qui renvoie la valeur du réel modifié.
Pour cela, sachez que struct.unpack(’>f’, bytes([64, 96, 0, 0])) retourne un tuple dont le pre-
mier élément est le réel représenté par les 4 octets 64, 96, 0 et 0.
Question 19 Prenons le réel 2. Quelle modification implique une modification du premier bit ? Du dernier
bit ? Du neuvième bit ? Pourquoi ?
4
4 Lecture et écriture de fichiers
Matériel fourni Un fichier texte nommé data, contenant un caractère UTF-8.
4.1 Deux modes d’ouverture des fichiers
Un fichier peut être lu dans deux modes différents avec Python. Soit il s’agit d’un fichier texte
et dans ce cas Python lira, et renverra, des caractères (qu’ils soient stockés sur 1, 2, 3 ou 4 octets),
soit il s’agit d’un fichier dit binaire (bien que cette appellation ait peu de sens, car les données sont
toujours représentées en binaire) et dans ce cas Python lira et renverra des octets.
Nous allons lire un fichier en utilisant ces deux modes pour bien cerner la différence.
Le mode de lecture est déterminé par le second paramètre passé à la fonction open. Le mode de
lecture par défaut est le mode texte. Pour lire (ou écrire un fichier) en mode binaire, il faut ajouter
un bà la chaîne de caractères correspondant au mode d’ouverture du fichier. Donc pour ouvrir
un fichier en lecture en mode binaire, il faut utiliser le mode rb et pour l’ouvrir en mode écriture
binaire il faut utiliser le mode wb.
4.2 Lecture de fichier
Question 20 Ouvrez le fichier data en lecture en mode texte ainsi qu’en mode binaire. Vous stockerez le
résultat de la fonction open dans deux variables stream_text et stream_bin respectivement pour le fichier
ouvert en mode texte et en mode binaire.
Ces deux variables correspondent à flux ouvert en lecture. Il est ensuite possible de lire un tel flux avec
la méthode read (que vous avez déjà utilisée dans d’autres contexte a priori ). De même, il est possible
d’écrire un flux (s’il a été ouvert en écriture), avec la méthode write. Un flux peut être, comme ici, un
fichier ouvert mais également une connexion réseau voire une chaîne de caractères. Le flux permet justement
de s’abstraire de la manière dont il a été obtenu. Dans ce TP, et dans les suivants, nous passerons souvent
des flux en paramètre. Gardez donc bien cela en tête.
Question 21 Lisez tout le flux en un seul appel à la méthode read() et stockez le résultat dans une
variable content_text (pour le flux ouvert en mode texte) et une variable content_bin (pour le flux ouvert
en mode binaire). Donnez la longueur lue pour les deux modes de lecture. Expliquez les résultats obtenus.
Question 22 Quel est le type de la variable content_bin ?
Question 23 Comment accéder au deuxième octet lu en mode binaire ?
4.3 Écriture de fichier
Nous allons maintenant écrire un fichier en mode binaire. Là encore le nom du mode est ambigu.
Cela ne signifie pas que nous allons écrire dans le fichier bit à bit, au contraire la fonction d’écriture
prend en entrée des octets.
Par exemple si output est un flux ouvert en écriture en mode binaire, output.write(bytes([65, 66]))
écrit les octets 65 et 66 dans le fichier (ce qui correspond aux caractères A et B).
Question 24 Ouvrir un nouveau fichier (nommé data.out) en écriture en mode binaire et écrire à l’intérieur
les octets 195 et 137. Il faut ensuite penser à fermer le fichier.
Question 25 Ouvrez maintenant le fichier avec un éditeur de texte (ce qui revient à l’ouvrir en mode
5
1 / 9 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !