Les fichiers

Guillaume Chanel, Damien Morard

Automne

Observer des fichiers binaires et textes

Fichiers textes

  • Retrouvez votre fichier texte sauvegardé lors des développements Siwft
  • Visualisez ce fichier avec la commande cat
  • Visualisez ce fichier avec le programme ghex

Fichiers binaires

  • Retrouvez votre fichier binaire sauvegardé lors des développements Siwft
  • Visualisez ce fichier avec la commande cat
  • Visualisez ce fichier avec le programme ghex

Que concluez-vous ?

Manipuler des fichiers binaires

Little- or big-endian ?

On peut stocker une suite d'octets (i.e. un nombre 16, 32 ou 64 bits) de deux manières:

  • Big-endian (poid fort d'abord)
  • Valeur Stockage
    0x1234 0x12 0x34
  • Little-endian (poid faible d'abord)
  • Valeur Stockage
    0x1234 0x34 0x12
https://palparepa.github.io/decker/
  • Commencez une nouvelle partie
  • Trouvez la quantité d'argent à votre disposition, la prendre en note
  • Exportez votre partie vers un fichier (i.e. pas une sauvegarde)
  • Effectuez un achat pour changer la quantité d'argent disponible, prennez en note le nouveau montant
  • Exporter votre partie avec le nouveau montant vers un nouveau fichier
  • Utilisez un éditeur hexadecimal (ghex) pour retrouver l'octet correspondant au montant. Le valider avec le fichier suivant
https://palparepa.github.io/decker/
  • Modifiez l'octets pour augmenter votre argent
  • Testez le resultat en important le nouveau fichier dans le jeu
  • Trouvez quel est le montant maximal possible d'argent dans le jeu (big endian ou little endian?). Créez et testez un fichier de sauvegarde correspondant.
  • Procédez d'une manière similaire pour augmenter vos compétences (Attaque, défense, etc.) à la valeur maximale (Aide: on peu démarrer le jeux avec des bonus).

Encoder des fichiers textes

ASCII (ISO/IEC 646)

ASCII (Amercian Standard Code for Information Interchange) est un standard qui permet d'encoder 128 caractères sur 7 bits

L'âge sombre du ASCII étendu

Problème: comment encoder les caractères d'autres languages (é, ö, ß, å, ...)

"Et mais on encode généralement des octets donc on a un bit de disponible !"

  • Les européens de l'ouest: super voici une table permettant d'encoder les lettres manquantes (ISO-8859-1)
  • Les européens de l'est: attendez nous on prefère celle là (ISO-8859-2)
  • Microsoft: bha nous on propose notre propre ASCII étendu (ISO-8859-2)
  • ... plus de 15 standards ISO (cyrilic, etc.) et 220 codes créés au total

  • Les chinois: arrêter de nous faire rire, nous on doit gérer plus de 40000 signes !!!

Unicode à la rescousse !

Solution: séparer l'encodage et les points de code (code-point)

Point de code: valeure numérique représentant un caractère (ou une autre significations)

Encodage: transformer un point de code en codage binaire

Unicode liste au total 1 114 112 points de code (0x0 à 0x10FFFF) permettant de transmettre quasiment tous les signes connus.

Encoder les points de code

Les encodages peuvent être:

  • compatible ASCII: les même codes sont utilisés qu'en ASCII pour les même symboles/caractères.
  • de taille fixe (ou variable): le même nombre de bits est utilisé pour chaque point de code.

Exemples d'encodages pour les points Unicode:

  • UTF-32: 4 bytes sont utilisés (Non compatible ASCII, taille fixe)
  • UTF-16: 2 à 4 bytes sont utilisés (Non compatible ASCII, taille variable)
  • UTF-8: 1 à 4 bytes sont utilisés (compatible ASCII, taille variable)
UTF: Unicode Transformation Format

UTF8

Intervals des points
de code (hex)
Nb. de bits Octet 1 Octet 2 Octet 3 Octet 4
[U+0000, U+007F] 7 0xxxxxxx Inspired from wikipedia
[U+0080, U+07FF] 11 110xxxxx 10xxxxxx
[U+0800, U+FFFF] 16 1110xxxx 10xxxxxx 10xxxxxx
[U+10000, U+10FFFF] 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Les x représentent les bits du nombre à coder

  • "Leading byte" indiquant que un seul octet est nécessaire
  • "Leading byte" indiquant que plusieurs octets sont nécessaires, suivant le nombre de bits de poids fort à 1
  • "Continuation byte" indiquant que les bits de cet octet doivent être combinés avec les bits d'un octet précédent

UTF8 - Exemples

Unicode (hex) En binaire UTF8 binaire UTF8 hex.
A U+0041 100 0001 0100 0001 41
é U+00E9 000 1110 1001 1100 0011 1010 1001 C3 A9
U+20AC 0010 0000 1010 1100 1110 0010 1000 0010 1010 1100 E2 82 AC

UTF8 - Exercices

  • Transformez la suite de points de code suivante en UTF8 (hexadecimal)
  • U+222BU+1D6F3U+2202U+1D6F3

  • En utilisant ghex, saisissez les octets correspondant dans un fichier
  • Affichez le contenu du fichier avec une commande ou un éditeur:
  • ∫𝛳∂𝛳

l