Cet article s’adresse aux développeurs qui s’intéressent aux méthodes permettant de stocker des données binaires dans un emplacement prévu pour du texte. Mais aussi dans le cas d’une transmission par un protocole texte, tel que le protocole HTTP (dans le cas d’échanges SOAP, par exemple).
Dans le cadre de mes activités de conseil en performance des applications, un résultat de test de charge a attiré mon attention sur un flux de web service qui consommait beaucoup de bande passante. Ce flux transmettait des données binaires via HTTP. Le client s’était appuyé sur l’encodage standard (base64). Le problème c’est que le résultat encodé prendra environ 33% de place en plus que le flux d’origine. On pourrait décider de compresser les données afin de gagner de la bande passante. Le problème est que certains clients ne sont pas capables d’effectuer la décompression. L’occasion pour moi de m’intéresser aux solutions alternatives.
Qu’est-ce qu’un contenu binaire ?
Certains fichiers ou flux d’information sont appelés binaires parce qu’on ne peut pas afficher à l’écran certaines données données qui les composent. Parce que ce ne sont pas des caractères (comme ceux qui composent cet article), mais peuvent des ordres transmis directement à la machine (comme faire biper le haut-parleur de la carte son, avec la commande « 7 » ou BEL). Faîtes l’expérience d’ouvrir un fichier .exe ou .zip (pas trop gros) en faisant glisser/déposer vers notepad. Sur cette capture d’écran on voit que des caractères ne sont pas affichés :
On dira, pour résumer, que ces caractères posent problème lorsqu’il s’agit de les acheminer par un protocole prévu pour transporter des caractères (comme HTTP) ou pour les stocker dans un emplacement prévu pour contenir du texte.
Exemples d’encodage binaire
Pour résoudre ces problèmes, on a inventé des méthodes qui transforment les caractères posant problème en série de caractères affichables. Par exemple, si le caractère n°7 (BEL) ne peut être affiché, on pourrait la transformer dans la séquence de caractères « \7 ». Dès que l’ordinateur voit le caractère « \ », il sait que le caractère qui suit est un code non affichable (et pour la barre oblique, on indiquera la séquence \\). L’humain peut donc afficher ces caractères (indirectement, à l’aide de cette convention), et l’ordinateur, les comprendre. Cette méthode s’appelle l’échappement (ou escape en anglais).
L’encodage base64 consiste lui — grosso-modo — à créer un nouvel alphabet ne contenant que des chiffres et des lettres. Et de décrire les 256 caractères exploités par le microprocesseur par une combinaison de symboles issus de cet alphabet (voir l’article Wikipédia pour plus de détails). De cette manière, tous les systèmes (Windows, Linux, Apple) sont capables de les comprendre. Par exemple, le message Bienvenue sur mon blog serait encodé par la séquence QmllbnZlbnVlIHN1ciBtb24gYmxvZw==
Dans les deux cas, on comprend que le message encodé prend plus de place que le message d’origine. C’est pour cela que des méthodes d’encodage alternatives ont vu le jour.
Méthodes alternatives et comparaisons
Il existe des méthodes alternatives (mais non officielles) à Base64. J’ai regroupé les principaux algorithmes dans ce tableau. Avec un utilitaire (en ligne) de démonstration des algorithmes, j’ai essayé d’encoder un fichier binaire (exécutable) de 144896 octets.
Il ressort de cela que le meilleur algorithme est yEnc avec un surplus (ou overhead en anglais) de seulement 4%. Bien entendu, ces chiffres (surtout pour la compression) dépendent de la nature des informations que vous souhaitez encoder. Il faudra donc faire vos propres tests et considérer d’autres aspects (tels que le respect des standards dans le cas d’une application ouverte) contextuels à votre projet.
Méthode | Taille encodage | Surplus | Compressé |
yEnc | 150766 | 4% | 64934 |
Ascii 85 | 179445 | 20% | 95380 |
Base 64 | 193196 | 26% | 73844 |
Uuencode | 196422 | 27% | 79610 |
Xxencode | 202886 | 29% | 80619 |
Sources documentaires
- Outil en ligne de démonstration d’encodage.
- Exemple d’encodeur/décodeur C# pour yEnc.
- Encodeur/décodeur yEnc en PHP.
- Articles Wikipédia en anglais, à parcourir depuis la page sur Base64.
2 réponses sur « [Développement] Méthodes d’encodage binaire »
Dans le cadre d’echange binaire en SOAP, tu as MTOM, qui permet de mettre des vrais bouts de binaires dans une envelope MIME. Pas d’overhead de decodage comme avec b64 ou autre.
Bonjour et merci de lire mon blog,
Tu as tout à fait raison. D’ailleurs, je vais revenir sur cette méthode dans le cadre d’un prochain article expliquant comment le simuler dans un test de charge. Cependant, MTOM s’utilise dans le cadre de SOAP et s’appuie sur un échange HTTP multi-part, alors que l’article se voulait un peu plus général (je n’aurais peut-être pas dû parler de SOAP ou préciser que je parlais d’un des champs du message qui ne passait pas par un <xop:Include…).
Pour les utilasateurs de .Net, le mécanisme MTOM (décrit en 2004 par le W3C) est supporté depuis WSE 3.0; un lien utile : sur la MSDN. Pour les autres, c’est supporté par Axis2 notamment.