{"id":2239,"date":"2026-04-13T11:28:26","date_gmt":"2026-04-13T10:28:26","guid":{"rendered":"https:\/\/coding4phone.com\/?p=2239"},"modified":"2026-04-13T11:39:55","modified_gmt":"2026-04-13T10:39:55","slug":"les-octets-cest-pas-sorcier-manipuler-des-donnees-binaires-avec-mogwai","status":"publish","type":"post","link":"https:\/\/coding4phone.com\/?p=2239","title":{"rendered":"Les octets, c&rsquo;est pas sorcier. Manipuler des donn\u00e9es binaires avec MOGWAI"},"content":{"rendered":"\n<p>Il \u00e9tait une fois un d\u00e9veloppeur (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&rsquo;octets, et la vague indication que les valeurs \u00e9taient encod\u00e9es en Little Endian.<\/p>\n\n\n\n<p>Martin soupira, ouvrit son \u00e9diteur, et se demanda par o\u00f9 commencer.<\/p>\n\n\n\n<p>Si vous vous \u00eates d\u00e9j\u00e0 retrouv\u00e9 dans la peau de Martin, cet article est pour vous. Nous allons explorer ensemble les outils que MOGWAI met \u00e0 votre disposition pour manipuler des donn\u00e9es binaires, sans douleur, et presque avec plaisir.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"premier-contact--le-type-data\">Premier contact : le type DATA<\/h2>\n\n\n\n<p>En MOGWAI, les donn\u00e9es binaires sont repr\u00e9sent\u00e9es par le type <code>DATA<\/code>, not\u00e9 avec le pr\u00e9fixe <code>D:<\/code>. C&rsquo;est simplement une s\u00e9quence d&rsquo;octets.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">D:FF45AB23<\/pre>\n\n\n\n<p>Ici, quatre octets : <code>0xFF<\/code>, <code>0x45<\/code>, <code>0xAB<\/code> et <code>0x23<\/code>. Simple, lisible, direct.<\/p>\n\n\n\n<p>On peut conna\u00eetre la taille d&rsquo;un <code>DATA<\/code> avec <strong>size <\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">D:FF45AB23 size ?<br># \u2192 4<\/pre>\n\n\n\n<p>Et acc\u00e9der \u00e0 un octet pr\u00e9cis avec <strong>get <\/strong>(index base z\u00e9ro) :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">D:FF45AB23 1 get ?<br># \u2192 69  (c'est 0x45 en d\u00e9cimal)<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"construire-une-trame-octet-par-octet\">Construire une trame octet par octet<\/h2>\n\n\n\n<p>Martin doit envoyer une commande \u00e0 son capteur. La commande est simple : un octet d&rsquo;en-t\u00eate (<code>0xAA<\/code>), suivi d&rsquo;un identifiant sur deux octets, suivi d&rsquo;un octet de fin (<code>0xFF<\/code>).<\/p>\n\n\n\n<p>Il peut construire cette trame avec l&rsquo;op\u00e9rateur <strong>+<\/strong> qui concat\u00e8ne deux <code>DATA<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">D:AA D:1234 + D:FF +<br># \u2192 D:AA1234FF<\/pre>\n\n\n\n<p>Ou bien construire un <code>DATA<\/code> depuis des valeurs pr\u00e9sentes sur la pile avec <strong>-&gt;data<\/strong> : <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">0xAA 0x12 0x34 0xFF 4 -&gt;data<br># \u2192 D:AA1234FF<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"extraire-une-partie-dand39une-trame\">Extraire une partie d&rsquo;une trame<\/h2>\n\n\n\n<p>La trame de r\u00e9ponse du capteur fait 8 octets. Martin sait que les octets 2 \u00e0 4 contiennent la valeur qui l&rsquo;int\u00e9resse. Il utilise <strong>sub <\/strong>(d\u00e9but + longueur) :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">D:FF001234ABCD0055 2 3 sub<br># \u2192 D:1234AB<\/pre>\n\n\n\n<p>Ou <strong>left <\/strong>et <strong>right <\/strong>pour prendre depuis le d\u00e9but ou la fin :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">D:FF001234ABCD0055 3 left<br># \u2192 D:FF0012<br><br>D:FF001234ABCD0055 2 right<br># \u2192 D:0055<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"land39endianness-ou-land39art-de-lire-dans-le-bon-sens\">L&rsquo;endianness, ou l&rsquo;art de lire dans le bon sens<\/h2>\n\n\n\n<p>C&rsquo;est l\u00e0 que Martin a failli abandonner. Son capteur encode les entiers en <strong>Little Endian<\/strong>, l&rsquo;octet de poids faible en premier. Donc la valeur <code>0x00001234<\/code> (soit 4660 en d\u00e9cimal) est stock\u00e9e comme <code>D:34120000<\/code> dans le fichier.<\/p>\n\n\n\n<p>MOGWAI a une famille compl\u00e8te de primitives pour g\u00e9rer \u00e7a proprement.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"nombre-\u2192-data\">Nombre \u2192 DATA<\/h3>\n\n\n\n<p>Pour encoder un entier en Little Endian :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">4660 -&gt;dataLE32<br># \u2192 D:34120000<br><br>4660 -&gt;dataBE32<br># \u2192 D:00001234<\/pre>\n\n\n\n<p>Les variantes couvrent 8, 16, 24, 32, 48 et 64 bits, en Little et Big Endian.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"data-\u2192-nombre\">DATA \u2192 Nombre<\/h3>\n\n\n\n<p>Et dans l&rsquo;autre sens, pour d\u00e9coder :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">D:34120000 dataLE32-&gt;<br># \u2192 4660<br><br>D:00001234 dataBE32-&gt;<br># \u2192 4660<\/pre>\n\n\n\n<p>La convention de nommage est volontairement sym\u00e9trique : <strong>-&gt;<\/strong> en pr\u00e9fixe signifie <em>on produit ce type<\/em>, <strong>-&gt;<\/strong> en suffixe signifie <em>on consomme ce type<\/em>. Une fois ce principe int\u00e9gr\u00e9, les noms deviennent \u00e9vidents.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"la-taille-nand39est-pas-toujours-connue-a-land39avance\">La taille n&rsquo;est pas toujours connue \u00e0 l&rsquo;avance<\/h3>\n\n\n\n<p>Si la taille en bits d\u00e9pend d&rsquo;une variable, les variantes dynamiques <strong>-&gt;dataLE<\/strong> et<strong> dataLE-&gt;<\/strong> acceptent la taille depuis la pile :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">4660 32 -&gt;dataLE<br># \u2192 D:34120000<br><br>D:34120000 32 dataLE-&gt;<br># \u2192 4660<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"et-pour-les-nombres-flottants-\">Et pour les nombres flottants ?<\/h2>\n\n\n\n<p>Le capteur de Martin envoie aussi des mesures de temp\u00e9rature encod\u00e9es en virgule flottante IEEE 754, sur 32 bits, en Little Endian. Pas de probl\u00e8me :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">23.5 -&gt;dataLE32F<br># \u2192 D:0000BC41<br><br>D:0000BC41 dataLE32F-&gt;<br># \u2192 23.5<\/pre>\n\n\n\n<p>Le <code>F<\/code> dans le nom indique qu&rsquo;il s&rsquo;agit d&rsquo;un flottant. Les variantes 64 bits (<strong>->dataLE64F<\/strong>, <strong>->dataBE64F<\/strong>, etc.) fonctionnent exactement de la m\u00eame fa\u00e7on.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"chercher-un-pattern-dans-une-trame\">Chercher un pattern dans une trame<\/h2>\n\n\n\n<p>Certaines trames commencent par un marqueur de d\u00e9but (<code>SOF<\/code>, Start Of Frame). Martin cherche <code>D:FF56<\/code> dans un buffer de donn\u00e9es :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">D:FF5623FF5678AB D:FF56 where<br># \u2192 (0 3)<\/pre>\n\n\n\n<p><strong>where <\/strong>retourne la liste de toutes les positions o\u00f9 le pattern appara\u00eet. Ici, le marqueur est pr\u00e9sent \u00e0 l&rsquo;index 0 et \u00e0 l&rsquo;index 3.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"convertir-un-data-en-liste-dand39entiers\">Convertir un DATA en liste d&rsquo;entiers<\/h2>\n\n\n\n<p>Parfois, il est plus pratique de travailler avec une liste de valeurs num\u00e9riques plut\u00f4t qu&rsquo;un bloc binaire. <strong>-&gt;list<\/strong> fait la conversion :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">D:FF45AB23 -&gt;list<br># \u2192 (255 69 171 35)<\/pre>\n\n\n\n<p>Chaque \u00e9l\u00e9ment de la liste est la valeur d\u00e9cimale de l&rsquo;octet correspondant.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"et-les-bits-\">Et les bits ?<\/h2>\n\n\n\n<p>Pour les op\u00e9rations au niveau du bit, MOGWAI dispose du type <code>B:<\/code> (binaire) et d&rsquo;un jeu complet d&rsquo;op\u00e9rateurs :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">B:11001010 2 &gt;&gt;     # D\u00e9calage \u00e0 droite \u2192 B:00110010<br>B:11001010 2 &lt;&lt;     # D\u00e9calage \u00e0 gauche \u2192 B:00101000<br>B:11001010 2 up     # Met le bit 2 \u00e0 1  \u2192 B:11001110<br>B:11001010 2 down   # Met le bit 2 \u00e0 0  \u2192 B:11001000<br>B:110011 1 bit?     # Le bit 1 est-il \u00e0 1 ? \u2192 true<\/pre>\n\n\n\n<p>Les op\u00e9rateurs classiques AND (<code><strong>&amp;<\/strong><\/code>), OR (<code><strong>|<\/strong><\/code>), XOR (<code><strong>^<\/strong><\/code>) et NOT (<code><strong>~<\/strong><\/code>) sont aussi disponibles sur les nombres.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"le-mot-de-la-fin\">Le mot de la fin<\/h2>\n\n\n\n<p>Martin finit par d\u00e9coder sa trame en une poign\u00e9e de lignes. Ce qui lui avait sembl\u00e9 rebutant au premier abord \u00e9tait devenu presque agr\u00e9able une fois les bons outils en main.<\/p>\n\n\n\n<p>Les fonctions de manipulation binaire de MOGWAI couvrent l&rsquo;essentiel des besoins : construction, extraction, endianness, flottants, recherche de patterns, op\u00e9rations bit \u00e0 bit. Le tout avec une convention de nommage coh\u00e9rente qui, une fois apprise, rend le code tr\u00e8s lisible.<\/p>\n\n\n\n<p>Et si vous avez besoin de CRC ou d&rsquo;autres op\u00e9rations plus sp\u00e9cialis\u00e9es, la r\u00e9ponse viendra sous forme de plugins, mais \u00e7a, c&rsquo;est une autre histoire.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><em><a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> \u2014 open source depuis f\u00e9vrier 2026 \u00b7 <a href=\"https:\/\/github.com\/Sydney680928\/MOGWAI\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub<\/a> \u00b7 coding4phone.com<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Martin, d\u00e9veloppeur, doit lire un fichier binaire d&rsquo;un capteur sans documentation. L&rsquo;article explique comment MOGWAI manipule facilement des donn\u00e9es binaires, incluant construction, extraction et gestion de l&rsquo;endianness.<\/p>\n","protected":false},"author":1,"featured_media":2249,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"D\u00e9couvrez comment Martin, un d\u00e9veloppeur, utilise MOGWAI pour manipuler des fichiers binaires et d\u00e9coder des donn\u00e9es sans souci.","jetpack_seo_html_title":"D\u00e9coder des fichiers binaires avec MOGWAI : Guide pratique","jetpack_seo_noindex":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[8,6,48,50],"tags":[],"class_list":["post-2239","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-mogwai","category-rpn","category-scripting"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/04\/coding-4-phone-69dcc483cac9e.png?fit=1024%2C1024&ssl=1","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfoe4s-A7","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2239","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2239"}],"version-history":[{"count":11,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2239\/revisions"}],"predecessor-version":[{"id":2260,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2239\/revisions\/2260"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/media\/2249"}],"wp:attachment":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2239"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2239"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2239"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}