Les octets, c’est pas sorcier. Manipuler des données binaires avec MOGWAI

Il était une fois un développeur (appelons le Martin) qui devait lire un fichier binaire produit par un capteur. Pas de documentation claire, juste une trame brute de quelques dizaines d’octets, et la vague indication que les valeurs étaient encodées en Little Endian.

Martin soupira, ouvrit son éditeur, et se demanda par où commencer.

Si vous vous êtes déjà retrouvé dans la peau de Martin, cet article est pour vous. Nous allons explorer ensemble les outils que MOGWAI met à votre disposition pour manipuler des données binaires, sans douleur, et presque avec plaisir.

Premier contact : le type DATA

En MOGWAI, les données binaires sont représentées par le type DATA, noté avec le préfixe D:. C’est simplement une séquence d’octets.

D:FF45AB23

Ici, quatre octets : 0xFF, 0x45, 0xAB et 0x23. Simple, lisible, direct.

On peut connaître la taille d’un DATA avec size :

D:FF45AB23 size ?
# → 4

Et accéder à un octet précis avec get (index base zéro) :

D:FF45AB23 1 get ?
# → 69 (c'est 0x45 en décimal)

Construire une trame octet par octet

Martin doit envoyer une commande à son capteur. La commande est simple : un octet d’en-tête (0xAA), suivi d’un identifiant sur deux octets, suivi d’un octet de fin (0xFF).

Il peut construire cette trame avec l’opérateur + qui concatène deux DATA :

D:AA D:1234 + D:FF +
# → D:AA1234FF

Ou bien construire un DATA depuis des valeurs présentes sur la pile avec ->data :

0xAA 0x12 0x34 0xFF 4 ->data
# → D:AA1234FF

Extraire une partie d’une trame

La trame de réponse du capteur fait 8 octets. Martin sait que les octets 2 à 4 contiennent la valeur qui l’intéresse. Il utilise sub (début + longueur) :

D:FF001234ABCD0055 2 3 sub
# → D:1234AB

Ou left et right pour prendre depuis le début ou la fin :

D:FF001234ABCD0055 3 left
# → D:FF0012

D:FF001234ABCD0055 2 right
# → D:0055

L’endianness, ou l’art de lire dans le bon sens

C’est là que Martin a failli abandonner. Son capteur encode les entiers en Little Endian, l’octet de poids faible en premier. Donc la valeur 0x00001234 (soit 4660 en décimal) est stockée comme D:34120000 dans le fichier.

MOGWAI a une famille complète de primitives pour gérer ça proprement.

Nombre → DATA

Pour encoder un entier en Little Endian :

4660 ->dataLE32
# → D:34120000

4660 ->dataBE32
# → D:00001234

Les variantes couvrent 8, 16, 24, 32, 48 et 64 bits, en Little et Big Endian.

DATA → Nombre

Et dans l’autre sens, pour décoder :

D:34120000 dataLE32->
# → 4660

D:00001234 dataBE32->
# → 4660

La convention de nommage est volontairement symétrique : -> en préfixe signifie on produit ce type, -> en suffixe signifie on consomme ce type. Une fois ce principe intégré, les noms deviennent évidents.

La taille n’est pas toujours connue à l’avance

Si la taille en bits dépend d’une variable, les variantes dynamiques ->dataLE et dataLE-> acceptent la taille depuis la pile :

4660 32 ->dataLE
# → D:34120000

D:34120000 32 dataLE->
# → 4660

Et pour les nombres flottants ?

Le capteur de Martin envoie aussi des mesures de température encodées en virgule flottante IEEE 754, sur 32 bits, en Little Endian. Pas de problème :

23.5 ->dataLE32F
# → D:0000BC41

D:0000BC41 dataLE32F->
# → 23.5

Le F dans le nom indique qu’il s’agit d’un flottant. Les variantes 64 bits (->dataLE64F, ->dataBE64F, etc.) fonctionnent exactement de la même façon.

Chercher un pattern dans une trame

Certaines trames commencent par un marqueur de début (SOF, Start Of Frame). Martin cherche D:FF56 dans un buffer de données :

D:FF5623FF5678AB D:FF56 where
# → (0 3)

where retourne la liste de toutes les positions où le pattern apparaît. Ici, le marqueur est présent à l’index 0 et à l’index 3.

Convertir un DATA en liste d’entiers

Parfois, il est plus pratique de travailler avec une liste de valeurs numériques plutôt qu’un bloc binaire. ->list fait la conversion :

D:FF45AB23 ->list
# → (255 69 171 35)

Chaque élément de la liste est la valeur décimale de l’octet correspondant.

Et les bits ?

Pour les opérations au niveau du bit, MOGWAI dispose du type B: (binaire) et d’un jeu complet d’opérateurs :

B:11001010 2 >>     # Décalage à droite → B:00110010
B:11001010 2 << # Décalage à gauche → B:00101000
B:11001010 2 up # Met le bit 2 à 1 → B:11001110
B:11001010 2 down # Met le bit 2 à 0 → B:11001000
B:110011 1 bit? # Le bit 1 est-il à 1 ? → true

Les opérateurs classiques AND (&), OR (|), XOR (^) et NOT (~) sont aussi disponibles sur les nombres.

Le mot de la fin

Martin finit par décoder sa trame en une poignée de lignes. Ce qui lui avait semblé rebutant au premier abord était devenu presque agréable une fois les bons outils en main.

Les fonctions de manipulation binaire de MOGWAI couvrent l’essentiel des besoins : construction, extraction, endianness, flottants, recherche de patterns, opérations bit à bit. Le tout avec une convention de nommage cohérente qui, une fois apprise, rend le code très lisible.

Et si vous avez besoin de CRC ou d’autres opérations plus spécialisées, la réponse viendra sous forme de plugins, mais ça, c’est une autre histoire.


MOGWAI — open source depuis février 2026 · GitHub · coding4phone.com

Laisser un commentaire

En savoir plus sur CODING 4 PHONE

Abonnez-vous pour poursuivre la lecture et avoir accès à l’ensemble des archives.

Poursuivre la lecture

En savoir plus sur CODING 4 PHONE

Abonnez-vous pour poursuivre la lecture et avoir accès à l’ensemble des archives.

Poursuivre la lecture