L'éditeur hexadécimal :
C'est un logiciel qui va permettre de visualiser et éventuellement de modifier le contenu de tout type de fichier.
Il peut nous servir à comprendre comment est constitué un fichier, mais également, lorsqu'un programme que l'on écrit est censé enregistrer un fichier, à voir si le fichier produit est bien conforme à ce qui est attendu.
Il en existe de nombreux qui fonctionnent tous plus ou moins de la même façon. Nous prendrons comme exemple l'éditeur Bless Hex Editor (GNU/Linux). Sous Windows, on pourra utiliser le logiciel CR-Hexact .
Visualiser un fichier
Visualisation d'un fichier :
Voici un exemple d'un petit fichier texte (tapé dans un éditeur de texte - Gedit) :
puis sa visualisation avec Bless Hex Editor :
La fenêtre de visualisation/édition d'un éditeur hexadécimal comporte toujours trois parties :
- au centre, on a l'affichage des différents octets qui constituent le fichier. Chacun de ces octets est affiché en hexadécimal, et peut donc prendre qu'une valeur entière comprise entre 00 et FF (256 valeurs possibles entre 0 ("00") et 255 ("FF")).
- à gauche (en rouge ici) les "adresses" de chaque premier octet de chacune des lignes d'octets affichés. Ces adresses sont écrites elles aussi en hexadécimal et sont ici codées sur 4 octets. Ce ne sont pas les adresses physiques réelles (sur le disque dur ou en mémoire) mais des adresses relatives, celle du premier octet étant arbitrairement notée 00000000.
Astuce : l'éditeur hexadécimal a été configuré ici pour afficher 16 octets par ligne. Ainsi l'adresse du premier octet de la première ligne étant 00000000, celle du premier octet de la ligne suivante sera 00000010, puis 00000020 etc. (Attention, 00000010 en hexadécimal = 16 en décimal !). Ceci permet un repérage plus rapide des adresses.
- à droite, on a une fenêtre de visualisation en ASCII (American Standard Code for Information Interchange) des octets situés dans la zone centrale. Pour un fichier texte pur (créé avec un éditeur de texte), la visualisation ASCII prend tout sons sens et on retrouve octet après octet, le contenu du fichier texte. En effet, si on regarde une table des codes ASCII (récupérée sur Wikipédia ) :
on constate que le chiffre 0 (attention on parle bien de symbole et pas de nombre !!!) est codé par la valeur 30, la lettre A par la valeur 41, la lettre a par la valeur 61 ou le z par la valeur 7A.
A remarquer ici : l'éditeur de texte a enregistré un code supplémentaire "OA" en fin de fichier. En consultant la table ASCII ci-dessus, on constate que ce code ne correspond pas à un symbole imprimable : c'est l'un des caractères de contrôle (sur fond rose dans cette table). Il correspond au code LF (Line Feed : saut de ligne qui est une marque sous Linux de la fin de ligne). Les caractères non imprimables sont généralement remplacés dans la partie visualisation par un point (".")
Ci-dessous, voici un autre exemple d'une petite partie d'un gros fichier de type son visualisé avec un tel éditeur. Il s'agit d'un fichier wav copié sur le disque dur à partir du CD audio original (Stella by starlight interprété par Miles Davis - Sessions de 1958). Le fichier n'est plus de type texte comme précédemment : c'est un fichier qualifié de binaire. (Dans cette partie du fichier wav, les octets servent à représenter les valeurs numérisées du signal sonore à reproduire. La partie droite (l'affichage en ASCII) n'a alors aucun intérêt :
Modifier un fichier
Modification d'un fichier à l'aide d'un éditeur hexadécimal :
Avant de commencer, signalons que ce genre de travail n'est à réaliser que sur des fichiers dont la modification n'aura pas d'incidence sur le système d'exploitation...
Revoyons le fichier texte_simple.txt :
On souhaite insérer un espace entre la suite de chiffres et la lettre A.
Commençons par repérer le code correspondant à un espace :
Il y a trois espaces dans ce petit texte : pas difficile de voir que le code correspondant est 20 en hexadécimal (on aurait pu également le retrouver dans la table ASCII).
Pour modifier un fichier avec l'éditeur hexadécimal, il faut d'abord regarder dans quel mode il est configuré : Insertion ou Modification. Le mode Insertion permet de venir intercaler un nouvel octet entre deux octets existants. Le mode Modification permet de changer la valeur d'un octet existant.
Dans l'éditeur Bless Hex Editor, le mode est indiqué dans la Barre d'état (Status Bar) en bas et à droite de la fenêtre (ici INS pour insertion).
1- Positionner le curseur à l'endroit où l'on veut réaliser l'insertion :
2- Entrer en hexadécimal la valeur de l'octet à insérer (ici la valeur 20) :
3- Utiliser la commande Enregistrer Sous (Save As) pour donner un autre nom au fichier modifié :
On peut alors voir la modification en allant ouvrir le fichier avec cette fois-ci un éditeur de texte :
L'espace ajouté est bien présent entre le 9 et le A !
Cas d'une image numérique
Une image numérique est réalisée à l'aide de points élémentaires appelés "pixels" (abréviation anglaise de "picture elements").
En ce sens elle reproduit l'idée des peintres pointillistes :
Robert Delaunay, 1906, Portrait de Metzinger
(source wikipedia)
Image en Noir et Blanc
(Ce type d'écran est qualifié aussi de "monochrome")
Exemple 1 : calculatrices.
Caractéristiques de la TI-82 Stats.fr :
-
Écran de 8 lignes de 16 caractères, 96x64 pixels.
Sur ce type d'écran comportant "peu" de pixels (96x64 = 6144 pixels ... à comparer aux écrans de PC ou de portables qui sont en millions de pixels), la pixellisation est déjà bien visible à l'oeil nu.
Avec une loupe :
on voit très bien a formation des lettres par juxtaposition de ces pixels
Exemple 2 : écran LCD (128 x64 pixels) dont on a pu récupérer la notice (« datasheet ») :
Sur ces types d'écran, un pixel (« picture element ») est soit allumé (noir) soit éteint (« blanc »). Chaque pixel peut donc être piloté par un seul bit (« binary element ») mis à 1 ou à 0. Un octet suffit alors à coder 8 pixels.
Remarquer le nombre de pixels dont disposent ces écrans : 96x64 pour l'un, 128x64 pour l'autre.
- Que constate-t-on (de quel multiple sont ces nombres) ?
Dans le cas de l'afficheur 128x64, un octet permet de piloter 8 pixels disposés sur une même verticale. Ecrire le code binaire, (puis sa conversion en décimal), nécessaire à la réalisation du motif compris entre les colonnes Y1 et Y6, en supposant que l'allumage d'un pixel est réalisé par un niveau 1 et son extinction par un niveau 0 :
Image en niveau de gris
Cas d'une image codée en niveaux de gris
C'est le cas des images dites en « Noir et Blanc » !
Dans ces images chaque pixel peut avoir une teinte plus ou moins grise, comprise entre le blanc et le noir.
Voici deux images de type bmp (« bitmap) de 20x10 pixels, très petites donc, mais fortement agrandies, suivies d'une partie de l'analyse du fichier correspondant (Rect_blanc_20x10.bmp et Rect_noir_20x10.bmp ) :
Chaque pixel est codé à l'aide d'un octet pouvant prendre comme valeurs extrêmes :
de
00000000 en binaire soit 0 en décimal ou encore 00 en hexadécimal
à
11111111 en binaire soit 255 en décimal ou encore FF en hexadécimal
Quelle valeur faut-il donner à un octet pour que le pixel correspondant apparaisse :
- noir : - blanc :
Combien d'octets sont nécessaires pour coder chacune de ces images :
On peut changer dans le logiciel de dessin la teinte de quelques pixels ou directement le code dans l'éditeur hexadécimal :
... et voici le résultat :
Image en couleur
Cas d'une image codée en RVB
C'est le cas de la majorité des images.
Cela provient de la structure des écrans couleurs : chaque pixel est constitué de 3 sous pixels (un rouge, un vert et un bleu).
Voir cette animation :
Chaque sous pixel est codé sur un octet.
Combien d'octets sont nécessaires pour coder une image de 20x10 pixels ?
Combien de couleurs différentes un tel codage permet-il de réaliser ?
Dans le fichier image du rectangle blanc (Rect_blanc_20x10_RVB.bmp), on a modifié les 9 derniers octets :
et voici le résultat :