
9 points autour de la notion d’octet
juillet 28, 2008L’octet (byte en anglais) est une unité de mesure informatique utilisée en SAS pour définir la longueur des variables. Il permet de stocker 1 caractère parmi une liste de 256. Une des listes de caractères les plus répandue est la table des ASCII (American Standard Code for Information Interchange). SAS dispose de deux fonctions RANK et BYTE pour passer d’un nombre à un de ces caractères et inversement. Ces notions sont à découvrir ou redécouvrir sous la forme de 9 points.
1. Des notions mathématiques mises à la sauce informatique
Deux valeurs possibles avec les booléens : Les booléens (boolean) sont des valeurs égales à 0 ou à 1. C’est une notation mathématique. On parle souvent de la logique des booléens. L’interprétation de ces valeurs est :
- 0 pour faux (false)
- 1 pour vrai (true)
En SAS, les syntaxes FIRST/LAST et END= du data step se servent de la logique des booléens.
Le bit est l’unité informatique de base : L’unité de mesure élémentaire en informatique, le bit (bit en anglais également) est basé sur le même principe. Le bit prend soit la valeur 0, soit la valeur 1.
L’octet est un groupement de 8 bits : Un octet (byte en anglais) est égal à la combinaison de 8 unités élémentaires, de 8 bits.
2. Le but du jeu
En informatique, le but du jeu est de n’utiliser que des valeurs 0/1 pour faire référence à des nombres entiers. Pour avoir un éventail de nombre entier assez large, il faut donc plusieurs bits.
Ensuite, pour chaque nombre entier une valeur peut être assignée. Par exemples, les nombres allant de 0 à 255 servent dans une table de référence pour les caractères, la table des ASCII.
3. Combien de valeurs différentes sont extraites avec x bits ?
Tout d’abord, les bits sont mis les uns à la suite des autres.
- Avec 1 bit : le bit prend soit la valeur 0 soit la valeur 1.
- Avec 2 bits : les valeurs de 2 bits s’arrangent de 4 manières différentes à savoir 00, 01, 10 ou 11.
- Avec 3 bits : les valeurs de 3 bits peuvent se présenter de 8 manières possibles 000, 001, 010, 011, 100, 101, 110, 111.
Généralisation : Pour savoir combien d’arrangements de 0 et 1 sont possibles, le nombre 2 (nombre de valeurs possibles dans un bit) est multiplié autant de fois qu’il y a de bits, soit 2x. En termes mathématiques, on parle du nombre d’arrangements avec répétition. Il s’agit bien du calcul avec répétition car les valeurs 0 et/ou 1 peuvent apparaître plusieurs fois.
Ecrire un exposant sous SAS : Pour mettre une valeur en exposant sous SAS, on fait suivre la base de 2 étoiles et de l’exposant. Voici un exemple pour une variable nommée EXPOSANT.
- En langage mathématique : exposant=28
- Sous SAS : exposant=2**8;
4. Quelle position pour mon bit ?
On commence par regarder celui qui est le plus à droite et on lui assigne la position 0. Celui qui suit aura une position 1, etc.
- Avec 1 bit : le bit est en position 0.
- Avec 2 bits : le premier bit est en position 1, le second en position 0.
- Avec 3 bits : le premier bit est en position 2, le second en position 1 et le dernier en position 0.
- Etc.
5. Création d’une liste de valeurs
Maintenant que la position (x) de chaque bit est connue, on va additionner des valeurs 2x à chaque fois que le bit est égal à 1. Voici donc quelques exemples avec 1, 2 et 3 bits. D’un côté, on a l’arrangement des bites, de l’autre la valeur que l’on peut en extraire.
Avec 1 bit, les valeurs finales sont entre 0 et 1.
- « 0 » : 0
- « 1 » : 20 = 1
Avec 2 bits, les valeurs finales sont entre 0 et 3.
- « 00 » : 0 + 0 = 0
- « 01 » : 0 + 20 = 0 + 1 = 1
- « 10 » : 21 + 0 = 2 + 0 = 2
- « 11″ : 21 + 20 = 2 + 1 = 3
Avec 3 bits, les valeurs finales sont entre 0 et 7.
- « 000 » : 0 + 0 + 0 = 0
- « 001 » : 0 + 0 + 20 = 0 + 0 + 1 = 1
- « 010 » : 0 + 21+ 0 = 0 + 2 + 0 = 2
- « 011 » : 0 + 21+ 20 = 0 + 1+ 2 = 3
- « 100 » : 22 + 0 + 0 = 4 + 0 + 0 = 4
- « 101 » : 22 + 0 + 20 = 4 + 0 + 1 =5
- « 110 » : 22 + 21 + 0 = 4 + 2 + 0 = 6
- « 111″ : 22 + 21+ 20 = 4 + 2 + 1 = 7
Avec 8 bits (1 octet) les valeurs vont de 0 à 255. Comme indiqué précédemment ces nombres servent pour la table des ASCII.
6. La table des ASCII et les fonctions RANK/BYTE
La table des ASCII regroupe les caractères en trois groupes :
- 0-31 : les codes de contrôle (control code) comme « passage à la ligne »
- 32-127 : les caractères imprimables (printable characters)
- 128-255 : les caractères spéciaux (special characters) comme é, à, û…
Note pour les claviers étrangers : La liste des caractères spéciaux est pratique à l’étranger lorsqu’un clavier d’ordinateur ne dispose pas des accents. Ainsi pour obtenir la lettre « é », maintenez la touche « Alt » enfoncé et tapez le nombre 0233. Voici ceux que j’utilise le plus souvent :
- 0224 à
- 0226 â
- 0231 ç
- 0233 é
- 0234 ê
- 0235 è
- 0238 î
- 0244 ô
- 0249 ù
- 0251 û
Exemples d’applications : Dans le cadre des fonctions SAS, je vais me concentrer sur les valeurs 32 à 255 car ce sont les valeurs que j’ai rencontré dans des data sets SAS. J’ai aussi eu besoin de vérifier qu’une macro pouvait toujours fonctionner quand elle rencontrait ces caractères dans un data set. Pour se faire, j’ai eu besoin de créer un data set les contenant.
7. Convertir un nombre en caractère (la fonction BYTE)
Dans cet exemple, la fonction BYTE génère toutes les valeurs ASCII imprimables et les sauvegarde dans une variable ASCII. Pour ce faire, une boucle est construite avec les instructions DO et END. C’est l’occasion d’introduire rapidement sous forme d’exemple la notion de boucle.
data one (drop=i);
do i=32 to 127;
*do i=128 to 255;
ascii=byte(i);
output;
end;
run;
La boucle est définie par variable i allant de 32 à 128 (et non 127) mais l’action est conduite seulement pour les valeurs 32 à 127. Les valeurs intermédiaires sont distantes d’une valeur 1 car l’incrémentation par défaut est 1. Pour changer cette valeur par défaut et disons prendre une valeur sur deux, on ajoute BY 2 dans l’instruction DO.
A chaque fin de boucle i est incrémenté par 1. Quand i=127, la valeur est calculée une dernière fois. Puis i est incrémenté par 1. Avec i=128, la condition n’est plus remplie. Le contenu de la boucle est ignoré. SAS s’intéresse à l’étape suivante dans le data step. Ici l’étape suivante est la suppression de la variable i définissant la boucle.
A chaque nouvelle valeur de la variable i, la variable ASCII est recalculée. Puis le record est ajouté dans le data set ONE grâce à l’instruction OUTPUT.
8. Convertir un caractère ASCII en nombre (la fonction RANK)
Dans cet exemple, la fonction RANK retourne la valeur numérique de la table ASCII pour la lettre « é ». Cette valeur est sauvegardée dans la variable VAL_NUM.
data two;
val_num=rank(‘é’);
run;
9. Les multiples des octets dans le commerce
Dans le monde des disques durs…, et taille de fichiers…., vous entendez couramment parler de :
- Kilooctet ou Ko (Kilo Byte KB en anglais),
- Megaoctet ou Mo (Mega Byte MB),
- Gigaoctet ou Go (Giga Byte GB),
- Teraoctet ou To (Tera Byte TB).
A l’avenir, on entendre peut-être même parle de :
- Petaoctet ou Po (Peta Byte PB),
- Exaoctet ou Eo (Exa Byte EB),
- Zebioctet ou Zo (Zebi Byte ZB),
- Yobioctet ou Yo (Yobi Byte YB).
La Commission Electrotechnique International (International Electrotechnique Commission IEC) a développé un standard se basant sur des multiples de 10 de l’octet. Cependant, l’ancien standard peut encore être rencontré.
- Nouveau standard : un Kilooctet est 1 000 octets (103). Un Megaoctet est 1 000 000 (106).
- Ancien standard : un Kilooctet représente 1 024 octets (210). Pour le Megaoctet, on passe à 1 048 576 (220).
En résumé, en achetant un disque dur de 500 Go, le produit est plus intéressant s’il réfère à l’ancien standard car il aura une plus grande capacité. Par contre, si on a un fichier de 5 Mo à envoyer, il représente moins de volume si on parle avec le nouveau standard.
Merci encore pour ce tuto utile.