RootsLabs

More than a tool ! GitHub Google+ LinkedIn RSS

Entre octets & bits : jouer en binaire en PHP

Progi1984 - Commentaires (0)

Pour PHPOffice, j’ai dû apprendre à travailler les octets d’un fichier en binaire. Voici un résumé de ce que j’ai appris et des astuces que j’ai soutiré.

Entre octets & bits : jouer en binaire en PHP

Un fichier est juste un tableau d’octets

Tout d’abord, il faut imaginer un fichier comme une chaîne de caractères.

Mais une chaîne de caractères est stocké au niveau mémoire comme un tableau (Source : PHP).

A ce niveau, on peut récupérer le code ASCII d’un élément du tableau :

Mais surtout son code hexadécimal :

Ainsi pour un fichier JPEG, les deux premiers octets d’un fichier sont 0xFFD8.
Pour le récupérer, utilisons nos snippets précédents :

Ce qui donne :

Un octet, mais pour deux, trois ou quatre…

Je voudrais récupérer directement les deux octets.
Au lieu de faire cela malproprement, c’est à dire via une simple concaténation, on va le faire du bitshifting ou décalage de bits.
Ainsi pour récupérer deux octets, on fait comme cela :

Donc après deux octets, il est très simple de faire avec trois ou quatre octets :

Byte order : Little endian & Big Endian

Word et les formats binaires de Microsoft m’ont apporté une difficulté : l’ordre des octets (Lien : MSDN).

Ainsi lorsque l’on lit 0xFFD8FFE0 par défaut, l’ordre des octets est du big-endian. En little endian, cela donne 0xE0FFD8FF.

Modifions nos fonctions pour que cela fonctionne. On a juste à choisir les octets par ordre inverse.

Après les octets, les bits

Il faut savoir qu’un octet est composé de 8 bits (1 ou 0).
On va récupérer via du bitshifting ces bits :

Mais on peut récupérer deux d’un coup :

Ou par quatre :

Ajouter un commentaire

Commentaire :