28 juillet 2010 02:44
Parlons binaire mais parlons bien
Bonsoir à toutes et à toutes. Je sais, je n’ai pas posté depuis la naissance de mon dernier stagiaire (fake story, si vous voulez savoir). Mais comprenez-moi, j’ai un agenda de chinois du FBI. Du coup, c’est entre 2 exécutions que je prend le temps de publier un petit billet absolument inutile. Mais marrant. Mais inutile quand même.
Aujourd’hui donc, nous allons apprendre à passer pour des gros nerds encoder du texte en binaire !
Tout d’abord, si vous cherchez une explication complète sur le système binaire, allez vous faire voir sur Wikipedia. Ce que je vais vous présenter est un script de conversion binaire/textuel. Ce qui implique une seconde étape, en réalité, car vous n’ignorez pas que le système binaire n’est rien de plus qu’un système numérique, et que par conséquent, tout nombre binaire ne reste qu’un nombre. Il faut donc savoir convertir des chaînes de caractères en nombres. Pour cela, on va utiliser la table ASCII, qui associe à chaque nombre de 0 à 127 (ce qui représente 7 bits, mais est écrit sur 8 par principe) un caractère (alphabet en casses haute et basse, chiffres, ponctuation, caractères de contrôle…). Problème, cette table ne contient aucun caractère accentué, ou ponctuation exotique… La solution est donc d’utiliser l’UTF-8, qui est défini sur 8 bits (donc, un octet). Il permet donc de représenter potentiellement tout caractère utilisable, dans toutes les langues existantes (sur Terre, je préfère le préciser). Ainsi, il nous est possible de convertir chaque caractère d’une chaîne en représentation binaire sur 8 bits, et donc, notre conversion est faite ! C’est aussi simple que ça. Et stupide, je vous l’accorde.
Avant toute chose, posons-nous une question d’importance :
À quoi ça sert ?
Ha, ha, ha. À rien de constructif. À passer pour un con, à se croire supérieur, à me servir d’excuse pour publier un billet tant attendu par mon public conquis. Mais aussi à cacher des messages dans d’autres, par exemple : imaginez un texte dont les premières lettres de lignes, converties en 0 ou 1 selon qu’elles soient voyelles ou consonnes, formeraient un message « secret » à déchiffrer par cette méthode ? C’est un peu la base de la stéganographie, et ça peut être rigolo.
Alors, on fait comment ?
J’y viens, ne poussez pas. Veuillez considérer la complexité malsaine du script ci-dessous :
< ?php
//Cette fonction décode une chaîne binaire (mise en forme avec des espaces ou non)
function bin2str($bin) {
$bin = str_replace(' ', '', $bin); //On se débarasse des éventuels espaces, utiles uniquement à la mise en forme
$string = '';
for($i=0;$i<strlen($bin);$i = $i+8) { //On découpe la chaîne en octets, qu'on traitera les uns après les autres
$string .= chr(bindec(substr($bin, $i, 8))); //Ici, le substr récupère effectivement l'octet qui nous intéresse; bindec le convertit en binaire (exemple : 00101111 => 47), et chr donne le caractère correspondant à cet index dans la table UTF-8)
}
return $string;
}
//Cette fonction transforme une chaîne de caractères quelconque en représentation binaire, et scinde cette représentation en octets pour faciliter la présentation
function str2bin($string) {
$bin = '';
for($i=0;$i<strlen ($string);$i++) { //On encode les caractères un à un, donc on parcourt l'intégralité de la chaîne
$bin .= str_pad(decbin(ord($string[$i])), 8, '0', STR_PAD_LEFT).' '; //La fonction ord() renvoie l'index (décimal) ASCII du caractère demandé; ensuite, on le convertit en binaire, puis on remplit de 0 sur la gauche jusqu'à obtenir une chaîne de 8 caractères (un octet valide). Puis on rajoute un espace pour faciliter la mise en forme
}
$bin = substr($bin, 0, -1); //On supprime le dernier espace
return $bin;
}
//Nous avons un seul formulaire, avec 2 actions possibles : celle à exécuter dépend du bouton "submit" cliqué (sa value est transmise, et on récupère le nom du bouton cliqué)
if(isset($_POST['act_bin'])) { //On traite le décodage du binaire
if(!empty($_POST['bin'])) { //Vérification de l'existence de la donnée
if(preg_match('/^[01 ]*$/', $_POST['bin'])) { //On s'attend à du binaire, donc on renvoie une erreur si ça n'en est pas
$bin = $_POST['bin'];
$str = bin2str($bin);
} else {
$warn = 'Format invalide.';
}
} else {
$warn = 'Veuillez entrer une chaîne binaire.';
}
}
if(isset($_POST['act_str'])) { //On traite la conversion en binaire
if(!empty($_POST['str'])) { //Vérification de l'existence de la donnée
$str = $_POST['str'];
$bin = str2bin($str);
} else {
$warn = 'Veuillez entrer une chaîne de caracères.';
}
}
?>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Conversion chaîne-binaire</title>
<style type="text/css"> /* mise en forme basique, inutile d'utiliser un CSS externe pour ça */
.warn { color: red; font-weight: bold; }
fieldset { margin: 10px; float: left; width: 300px; }
fieldset textarea { width: 100%; }
</style>
</head>
<body>
< ?php if(isset($warn) && !empty($warn)) echo '<p>'.htmlspecialchars($warn).''; //Si un message d'erreur a été défini, on l'affiche dans un rouge effrayant ?>
<form action="bin.php" method="post">
<fieldset> <!-- subtilité : nous avons 2 fieldsets, chacun contenant un bouton "submit". Selon le bouton utilisé, on appelle une fonction ou l'autre -->
<legend>Chaîne</legend>
<textarea name="str" cols="25" rows="10">< ?php if(isset($str) && !empty($str)) echo htmlspecialchars($str); ?></textarea>
<input type="submit" name="act_str" value="Convertir &gt;&gt;" />
</fieldset>
<fieldset>
<legend>Binaire</legend>
<textarea name="bin" cols="25" rows="10">< ?php if(isset($bin) && !empty($bin)) echo htmlspecialchars($bin); ?></textarea>
<input type="submit" name="act_bin" value=" &lt;&lt; Convertir" />
</fieldset>
</form>
</body>
</html>
Voilà, c’est tout commenté et propre, et vous pouvez tester le convertisseur en ligne ici. Utilisable si un con (moi) se met à écrire en binaire sur un forum.
5 Comments »
5 Responses to “Parlons binaire mais parlons bien”
Leave a Reply
You must be logged in to post a comment.
Radek411
on 22 nov 2010 at 12:38
Bonjour,
Félicitation pour ce très intéressant script, très sympathique a décortiquer.
Radek411
MsTeshi
on 18 avr 2011 at 9:09
Très pratique pour faire mumuse et du kikoolol /-)
damien_dailleur
on 23 juil 2011 at 12:00
Perso, je l’aurai fais en C pour le fun mais pourquoi pas
Gordontesos
on 23 juil 2011 at 12:22
Just do it !
Je l’ai fait en PHP parce que par la force des choses, c’est ce que je maîtrise le mieux. Mais si tu veux le porter en C ou n’importe quoi, je serais ravi de poster ta contribution.
Rogdham
on 23 sept 2011 at 2:17
Une version en brainfuck pour la route : http://r.rogdham.net/8