Données en informatique

Les système informatique utilise, à leur base, un langage connu sous le nom de langage binaire : une suite de 0 et de 1 qui sert à définir des instruction, afficher un caractère, réalisé un calcul etc. Mais l’utilisateur va manipuler des données plus lisible.
Tour d’horizons des différentes données de l’univers informatique

Unité de mesure

« bit »

Le bit, pour binary digit (chiffre binaire). C’est l’unité de mesure de base de l’information de la plupart des système informatique. Un bit ne prend que deux valeur possible : 0 ou 1. Il se marque généralement « b ».
Exemple :

  • 1b, 1Kb (1 Kilo-bit, soit 1 000 bits) ou 1Mb (1 Mega-bit, soit 1 000 000bits).

byte[en] ou multiplet[fr] (généralement octet [fr])

Un byte, prononcé [bait] (comme le y dans le mot anglais « My ») désigne une suite de bits. En français on devrait le désigner par multiplet (doublet pour une suite de deux, triplet pour 3 etc.).

Dans le langage informatique, on manipule régulièrement une suite de 8 bits, ce qui dans ce cas précis donne en français un « octet ».

Ils s’écrivent :

  • 1B, 1KB (kilo-Bytes, soit 1000 Bytes) ou 1MB (Mega-Byte, soit 1 000 000 byte)
  • 1o, 1ko (kilo-octet, 1 000 octets) ou 1mo(mega-octet, 1 000 000 octets)

Un octet/byte peut concrètement contenir un nombre en 0 et 255, du fait du nombre de combinaison possible dans une suite de 8 bits. En effet, 1bit ne contenant que 2 valeur possible, il existe 2 puissance 8 combinaison possible (256).

Types

Les langage de programmation stricts imposent de typer les variables dans lesquelles sont stockées les données.

Pour le case du type uShort par exemple, la donnée sera codée sur 16bits, donc 2 Bytes (ou 2 octets), soit 2 puissance 16 combinaison soit 65536 valeur uniquement positive. Il est semblable au short qui est lui aussi stocké sur 2 octets mais autorisant les nombres négatifs, ce qui limite donc la valeur positive stockée : des valeurs jusqu’à 32768, seront donc stockables  ainsi que leur équivalent négatif (jusqu’à -32768).

Le type int, qui est codé sur 32bits, aurant donc une amplitude de valeur plus importante. Voici comment un entier (int) codé sur 4 octet de valeur 5 pourra être affiché :

00000101 00000000 00000000 00000000 //Binaire
05 00 00 00 //Donnée binaire convertit en Hexadecimal

Voici un tableau des principaux type de variable contenant un nombre.

C# type/keyword Range Size .NET type
sbyte -128 to 127 Signed 8-bit integer System.SByte
byte 0 to 255 Unsigned 8-bit integer System.Byte
short -32,768 to 32,767 Signed 16-bit integer System.Int16
ushort 0 to 65,535 Unsigned 16-bit integer System.UInt16
int -2,147,483,648 to 2,147,483,647 Signed 32-bit integer System.Int32
uint 0 to 4,294,967,295 Unsigned 32-bit integer System.UInt32
long -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 Signed 64-bit integer System.Int64
ulong 0 to 18,446,744,073,709,551,615 Unsigned 64-bit integer System.UInt64

A ces types viennent s’ajouter les connus valeur à virgules :

  • Float (32bits)
  • Double (64bits)
  • Decimal (128bits)

Format

Les bits, formants le langage binaire, formate la façon dont les données sont consultées/stockées par un ordinateur initialement. Ensuite, selon l’objectif du fichier, il est interprété différement par différent logiciel pour afficher l’information stockée (une image, un texte, une video…)
Selon l’objectif souhaité, il est toutefois possible de créer des données au format binaire.

Fichiers binaire

Pour contenir des données dites brut, on les stocke donc dans des fichiers binaires. Par convention, ces fichiers finissent par .bin.

Un fichier binaire contiendra donc une suite de 0 et de 1 mais pourra être affiché comme une suite de valeur Hexadecimal. En effet, une valeur hexadecimal, en base 16 donc, peut representer 1 valeur (00) jusqu’à 255 (FF) ; elle est donc parfaite pour représenté un octet.

L’entier (int) codé sur 4 octet de valeur 5 peut donc être affiché :

05 00 00 00 //Donnée binaire convertit en Hexadecimal

Attention toutefois : pour lire ces fichiers, il faudra un logiciel de lecture de fichier binaire. En effet, les logiciels d’aujourd’hui interprètent les données binaire selon l’utilisation : un logiciel image y verra des couleurs et des emplacements de pixels, un éditeur de texte y verra des caractère, un de cartographie des tracés sur une carte etc…

Le logiciel Binary Viewer permet par exemple de lire les données binaires et de les affichés dans différent format (binaires, hexadecimal etc.)

Structure

Dans les exemples précédent a été abordé les fichiers binaires contenant des données brut : aucun indication ni règle via indiquer ce qu’il contient, à quoi correspond les données, comment elles sont organisées etc. Ainsi, des convetions de structure ont été mis en place.

Entete/Fin

Ils peuvent contenir un entête qui identifiera l’objectif du fichier et la manière dont il doit être lu. C’est ce qui permettra à un logiciel de savoir comment interprété l’ensemble des données.

Il n’y a pas de norme pour l’entête mais elle peut toutefois contenir une signature (aussi apellé Magic Number ou Magic Bytes) identifiant son extention.
Par exemple, la suite Hexadecimal 38 42 50 53 est utilisé pour pour les fichiers .psd. D’autre fois, tel que pour les fichiers .JPG, 0xFF-D8 (Start of Image-SOI) identifiera le début des octets réservé à l’image et 0xFF-D9 (End of Image-EOI) la fin.

On trouve aussi le concept de End Of File pour les système d’exploitation qui permet d’indiquer la fin d’un fichier.

Le stockage de données sans entête permet de répondre à des besoin de poids de fichier et de confidentialité : un tel fichier ne pourra être interprété que par le logiciel qui l’a créé par exemple.

Contenu

Imaginant un fichier binaire contenant des informations pour chaque utilisateur d’un site. Chaque groupe de donnée identifiera des information sur l’utilisateur.

  • La version : un premier byte pour définir la version des données présente. Ainsi, si la version 1 doit stocker un nom d’utilisateur (string) et un age (int), et la deuxième un nom d’utilisateur (string) et une année (int), il sera facile d’interprété les deux octets qui suivent correctement;
  • Les tableaux de byte : le contenu du fichier sera suivi de tableaux de bytes représentant les données et dont la signification dépendra de la version.
  • Une réserve : par la suite, une zone du contenu pourra ne rien contenir mais être là au cas où la données à stocker pourrait évoluer. On peut imaginer par la suite que le groupe de donnée sera enrichi d’une date d’inscription (int)
  • Une empreinte (ou somme de controle) ou CheckSum : une valeur dépendant des données stockée permettant de s’assurer que l’une des valeurs du groupe de donnée qui précède  n’a pas été altérée. On peut imaginer qu’il contiendra la somme de toute les données divisées par une valeur convenu de manière à ce qu’il ne prenne pas beaucoup de place.

Chaque données à stocker devra donc convertit de son type d’orgine (int, float, double, string…) vers un tableau de byte. Des méthodes du Framework .NET existe déjà pour cela :

//String
// https://docs.microsoft.com/fr-fr/dotnet/api/system.bitconverter.getbytes?view=netframework-4.8https://docs.microsoft.com/fr-fr/dotnet/api/system.bitconverter.toint32?view=netframework-4.8
byte[] bytes = Encoding.ASCII.GetBytes(someString);
string someString = Encoding.ASCII.GetString(bytes);

Ici la serialisation d’un string vers un tableau de byte utilise l’encodage/jeu de caractère ASCII.
Un excellent article sur les jeux de caractères au fil de l’histoire et leur encodage est disponible ici : https://zestedesavoir.com/tutoriels/1114/comprendre-les-encodages/2-histoire/#1-1-ascii.

En résumé : à l’heure actuel on utilise le jeu/table de caractère Unicode, faisant le lien entre une valeur codée sur 21 bits (soit 2 097 152 valeurs) et un caractère.
Ensuite, l’encodage conseillé UTF-8 se chargera d’allouer qu’1 à 2 octets (maximum) pour chaque caractère des alphabets Européen à inscrire en mémoire.

//Number
//https://docs.microsoft.com/fr-fr/dotnet/api/system.bitconverter.toint32?view=netframework-4.8
int nb = 5; //or double, float, etc.
byte[] nbBytes = BitConverter.GetBytes(nb);
nb = BitConverter.ToInt32(nbBytes); //ToDouble, to Int16...

Comme vu précédemment, le int prenant 32bits son tableau aurait pu être déclarer en tant que new byte[4];

Ensuite, il suffit d’écrire le buffer (les données totales sous forme de byte) dans un fichier bin grace à un BinaryWriter.

int nb = 5; //or double, float, etc. 
byte[] buffer = BitConverter.GetBytes(nb);

FileStream fileStream = new FileStream("binaryFile.bin", FileMode.Create);
using (BinaryWriter binaryWriter = new BinaryWriter(fileStream))
{
   binaryWriter.Write(buffer);
}
Sources
  • https://fr.wikipedia.org/wiki/Bit
  • https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/integral-numeric-types
  • https://fr.wikipedia.org/wiki/Fichier_binaire
  • https://fr.wikipedia.org/wiki/Somme_de_contr%C3%B4le
  • http://www.net-informations.com/q/faq/float.html
  • https://stackoverflow.com/questions/16072709/converting-string-to-byte-array-in-c-sharp?rq=1
  • https://docs.microsoft.com/fr-fr/dotnet/api/system.bitconverter?view=netframework-4.8
  • https://zestedesavoir.com/forums/sujet/6210/un-fichier-binaire-moi-je-ne-vois-pas-que-des-1-et-des-0/
  • https://zestedesavoir.com/tutoriels/1114/comprendre-les-encodages/2-histoire/#1-1-ascii.
  • https://fr.wikipedia.org/wiki/End-of-file

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *