edubun
Français

Octets, hexadécimal et texte

La lettre A est stockée sous la forme 65, soit 01000001. En UTF-8, une syllabe coréenne comme U+D55C occupe trois octets.

D'abord une énigme du quotidien. (C'est un exemple inventé.) Un élève tape le mot Korean dans une discussion, six lettres. Un ami tape le même mot en écriture coréenne, ce qui fait trois syllabes. Quel message est le plus gros ? Sans doute pas celui que tu crois. Enregistrées en UTF-8, les six lettres anglaises font 6 octets. Les trois syllabes coréennes font 9 octets, trois chacune. La RFC 3629, la norme qui définit l'UTF-8, prend justement ce mot comme exemple et détaille ses octets : ED 95 9C EA B5 AD EC 96 B4. Deux choses expliquent l'écart. Il faut une façon courte d'écrire les octets, et il faut la convention qui transforme les lettres en nombres.

Deux chiffres hexadécimaux pour chaque octet

Ces paires de lettres et de chiffres, c'est de l'hexadécimal, ou hexa. De longues rangées de 0 et de 1 sont difficiles à lire, alors les programmeurs utilisent ce raccourci. L'hexadécimal a seize chiffres : de 0 à 9, puis de A à F pour dix à quinze. Un chiffre hexadécimal couvre exactement quatre bits, donc un octet s'écrit toujours avec deux chiffres hexadécimaux. Coupe 01000001 en 0100 et 0001. Cela fait 4 et 1, donc l'octet vaut 0x41, où 0x indique seulement « ceci est de l'hexadécimal ». En décimal, cela fait 4 × 16 + 1 = 65.

Tu as sûrement déjà croisé l'hexadécimal sans t'en rendre compte. Les couleurs des pages web s'écrivent souvent #RRGGBB, un octet pour chacune des lumières rouge, verte et bleue (MDN). #FF0000 est un rouge pur : 255 dans le premier octet, 0 dans les deux autres. #FFFFFF est du blanc. Le plus grand octet, 11111111, s'écrit 0xFF, et 0xFF = 15 × 16 + 15 = 255.

A vaut 65 parce que tout le monde s'est mis d'accord

Un ordinateur ne sait pas ce qu'est une lettre. Il stocke un nombre, et tout le monde convient à l'avance de quel nombre représente quelle lettre. La convention utilisée sur les premiers réseaux était l'ASCII, et la RFC 20 l'a fixée pour l'ARPANET en 1969. L'ASCII utilise 7 bits, il a donc 128 codes. Le A majuscule vaut 65, B vaut 66, et ainsi de suite jusqu'à Z, qui vaut 90. Le a minuscule vaut 97. C'est exactement 32 de plus que A, une différence d'un seul bit. Les chiffres sont aussi des codes. Le caractère 0 vaut 48, donc le caractère « 7 » est stocké sous la forme 55, et non comme le nombre 7.

Chargement

Fais glisser pour tourner. Fais défiler ou pince pour zoomer.

Les interrupteurs affichent 01000001, la lettre A. Choisis une autre lettre dans le menu pour voir sa combinaison, ou bascule l'interrupteur 32 pour passer des majuscules aux minuscules.

Pourquoi une syllabe coréenne demande trois octets

128 codes suffisent largement pour l'anglais et sont très loin de suffire pour le coréen, l'arabe, le chinois ou les emoji. Unicode donne à chaque caractère des écritures du monde son propre numéro, appelé point de code, jusqu'à U+10FFFF. L'UTF-8 (RFC 3629) est la façon la plus courante de transformer ces numéros en octets, avec un à quatre octets par caractère. Les 128 caractères ASCII gardent leur ancien code sur un octet, si bien qu'un texte anglais simple est identique en ASCII et en UTF-8. Le tableau de la RFC place tous les points de code de U+0800 à U+FFFF dans la ligne à trois octets, et les syllabes coréennes sont dans cette plage. Un é accentué prend deux octets, une syllabe coréenne comme U+D55C en prend trois, et un emoji comme 😀 en prend quatre. Le premier octet annonce même la longueur. ED s'écrit 11101101, et ses trois 1 de tête indiquent que ce caractère fait trois octets.

CaractèrePoint de codeOctets UTF-8 (hexa)Octets
AU+0041411
aU+0061611
éU+00E9C3 A92
Syllabe coréenne (U+D55C)U+D55CED 95 9C3
😀U+1F600F0 9F 98 804

Un texte illisible, ce sont les bons octets lus avec la mauvaise convention

Un fichier texte brut, ce sont ces octets à la suite et rien d'autre. Le mot Hello enregistré en UTF-8 fait cinq octets : 48 65 6C 6C 6F en hexadécimal, soit 72, 101, 108, 108, 111 en décimal. Les deux l sont le même octet deux fois. Ouvre maintenant ce fichier, ou un fichier en coréen, avec la mauvaise convention, par exemple un ancien encodage coréen ou japonais au lieu de l'UTF-8. Le programme lit exactement les mêmes octets comme d'autres caractères. Rien n'est cassé dans le fichier, et le rouvrir en UTF-8 fait revenir le texte.

Où sont passés les 34 Go manquants

Comme 2 puissance 10 vaut 1024, proche de 1000, on a longtemps utilisé « kilooctet » pour les deux. En décembre 1998, la CEI a approuvé des noms distincts, que le NIST recense : 1 ko vaut 1000 octets mais 1 Kio, un kibioctet, vaut 1024 octets ; 1 Mo vaut 1 000 000 d'octets mais 1 Mio vaut 1 048 576 octets. Les fabricants de disques comptent en puissances de dix. Un disque vendu comme 500 Go contient 500 000 000 000 octets. Un système d'exploitation qui compte en puissances de deux divise par 1 073 741 824 et affiche environ 465.66 Gio. Les quelque 34 qui semblent disparus n'ont jamais existé. Les deux nombres utilisent simplement des unités différentes. L'écart grandit avec l'unité : un Kio est 2.4 % plus grand qu'un ko, un Gio environ 7.4 % plus grand qu'un Go.

Erreurs fréquentes
  • « 1 Ko vaut exactement 1000 octets partout. » Selon la norme, ko signifie 1000 octets et 1024 octets font un Kio. Dans la pratique, les anciens noms servent encore dans les deux sens. Le NIST note que les fabricants de mémoire entendent en général 2²⁰ octets par mégaoctet, alors que ceux du stockage entendent 1 000 000, et que l'ancienne disquette « 1.44 Mo » utilisait un troisième mégaoctet de 1 024 000 octets. Quand la taille exacte compte, cherche le i : Kio, Mio, Gio.
  • « Mon disque de 500 Go est arrivé avec 34 Go en moins. » 500 000 000 000 octets ÷ 1 073 741 824 ≈ 465.66 Gio. Mêmes octets, autre unité. 500 − 465.66 ≈ 34.34, et cet écart, ce sont les 34 « manquants ».
  • « Un caractère fait toujours un octet. » En UTF-8, ce n'est vrai que pour les 128 caractères ASCII. é occupe 2 octets, une syllabe coréenne 3 et 😀 4 : une limite comptée en octets se remplit donc environ trois fois plus vite avec un texte coréen qu'avec un texte anglais.
  • « Le caractère 7 est stocké comme le nombre 7. » Le caractère « 7 » a le code 55, soit 00110111. Un programme qui lit « 7 » dans un texte doit le convertir en nombre 7 avant de pouvoir calculer avec.
Note du professeurPartez des octets sur papier, pas des définitions. Écrivez Hello, cherchez ensemble les cinq codes dans une table ASCII, et seulement ensuite montrez l'hexadécimal. C'est là que les élèves bloquent. Faites-leur écrire un octet en 8 bits, tracer un trait au milieu et transformer chaque moitié en un chiffre, avec à côté une petite liste 10 = A ... 15 = F. L'écart de 32 entre A et a mérite d'être signalé, car basculer un seul bit dans la scène le fait retenir. Si un ordinateur est disponible, enregistrez une ligne d'anglais et une ligne de coréen dans deux fichiers texte UTF-8 et comparez leur taille.
  1. Combien vaut 0x41 en décimal ?
  2. Combien vaut 0xFF en décimal ?
  3. Combien de bits représente un chiffre hexadécimal ?
  4. A vaut 65 en ASCII. Quel nombre correspond à C ?
  5. De combien le code de a dépasse-t-il celui de A ?
  6. Combien de codes compte l'ASCII sur 7 bits ?
  7. Combien d'octets occupe la syllabe coréenne U+D55C en UTF-8 ?
  8. Quel caractère est stocké sous la forme 01000010 ?
    • B
    • A
    • b
    • 2
  9. Combien d'octets y a-t-il dans 1 Mio ?
  10. Un disque contient 500 000 000 000 octets. Cela fait environ combien de Gio ? (une décimale)
L'essentiel
  • Un chiffre hexadécimal = 4 bits ; un octet = deux chiffres hexadécimaux (0x00 à 0xFF).
  • ASCII : A = 65, a = 97, 0 = 48 ; 128 codes sur 7 bits.
  • L'UTF-8 utilise de 1 à 4 octets par caractère ; un texte ASCII reste identique.
  • 1 ko = 1000 o, 1 Kio = 1024 o ; 1 Mio = 1 048 576 o.
Sources de ce cours (9)
  • (checked 2026-10-17; reordered 2026-10-19: standards first, then official documentation, then the teaching model and calculations, history sources last)
  • Standards: NIST, "Prefixes for binary multiples" (physics.nist.gov/cuu/Units/binary.html: IEC approved kibi, mebi, gibi in December 1998; 1 B = 8 bit; 1 MiB = 1 048 576 B; 1 MB = 1 000 000 B; 1 GiB = 1 073 741 824 B; historical note: memory makers usually mean 2²⁰ bytes by megabyte, storage makers 1 000 000, and the "1.44 MB" diskette uses a megabyte of 1 024 000 bytes)
  • IETF RFC 20 "ASCII format for Network Interchange" (1969, 7-bit codes, A = 65, a = 97, 0 = 48)
  • IETF RFC 3629 "UTF-8, a transformation format of ISO 10646" (2003: 1 to 4 octets per character, ASCII unchanged, code points up to U+10FFFF, U+0800 to U+FFFF take three octets, "the first octet of a multi-octet sequence indicates the number of octets", example U+D55C U+AD6D U+C5B4 = ED 95 9C EA B5 AD EC 96 B4)
  • Official documentation: MDN Web Docs, "<color>" (hexadecimal colour notation #RRGGBB)
  • Intel, "Intel Chips" timeline poster (2012: Intel 4004 of 1971 with 2,300 transistors; 2nd generation Core 2010 with 1.16 billion)
  • Claude E. Shannon, "A Symbolic Analysis of Relay and Switching Circuits", Transactions of the AIEE vol. 57 (1938)
  • abstract of his MIT master's thesis. Computer History Museum, The Silicon Engine, "1947: Invention of the Point-Contact Transistor" (Bardeen and Brattain, December 1947, germanium)
  • John von Neumann, "First Draft of a Report on the EDVAC" (30 June 1945, Moore School, reprinted in IEEE Annals of the History of Computing 15:4, 1993).

Consulté le: 2026-10-17