web-dev-qa-db-fra.com

Comment cette personne a-t-elle codé "Hello World" avec Microsoft Paint?

Je viens de voir cela ces derniers jours et je n'arrive pas à comprendre comment cela fonctionne. La vidéo dont je parle est ici :

C'est la réponse la mieux notée de cette question de débordement de pile: Pourquoi ce programme a-t-il été rejeté par trois compilateurs?

Comment cette image bitmap peut-elle afficher un programme C++ pour "Hello World"?

97
Eamonn O'Brien

Une image BMP (DIB) est composée d'un en-tête suivi de non compressé1 données de couleur (3 octets par pixel pour les images 24 bpp, stockées dans l'ordre inverse des rangées et avec un pas de 4 octets).

Les octets des données de couleur sont utilisés pour représenter les couleurs (c’est-à-dire qu’aucun d’eux n’est "mandaté" par le format de fichier).2, ils viennent tous de la couleur de chaque pixel), et il existe une correspondance parfaite 1: 1 entre les couleurs de pixel et les octets écrits dans le fichier; ainsi, en utilisant des couleurs parfaitement choisies, vous pouvez réellement écrire tout ce que vous voulez dans le fichier (à l'exception de l'en-tête).

Lorsque vous ouvrez le fichier généré dans le bloc-notes, les données de couleur sont affichées sous forme de texte. vous pouvez toujours voir clairement à partir de l'en-tête (la partie de BM au début du texte), qui est mandaté par le format de fichier.

À mon avis, cette vidéo a été réalisée de la manière suivante: l'auteur a tout d'abord calculé la taille requise pour le bitmap et créé un fichier DIB de la taille correcte, rempli d'une couleur se développant en un motif simple (par exemple, tous les octets 65 => 'A'); a ensuite remplacé ce modèle par le code "payload", comme indiqué dans la vidéo.

Notez cependant qu’il n’est pas impossible de tout fabriquer à la main avec le bloc-notes - avec la boîte de dialogue du sélecteur de couleur, une table ASCII) et une connaissance de base du format DIB, cela peut être fait, mais être beaucoup plus lent et sujet aux erreurs.

Plus d'infos sur le format DIB


  1. Il existe des DIB compressées RLE, mais dans ce cas, des bitmaps non compressés sont utilisés (et ils le sont très rarement de toute façon).
  2. À l'exception de la foulée, cela a été évité en utilisant des lignes multiples de 4 octets.
55
Matteo Italia

Je suppose que vous faites référence à la réponse à l’une des questions du poisson d’avril.

À mon avis, chaque pixel a une représentation binaire. Et que chaque caractère du code source possède une représentation binaire.

La personne qui a créé le programme doit avoir défini la couleur de chaque pixel qui aurait une représentation binaire correspondant à chaque caractère.

18
Andrew Grimm

D'un point de vue informatique théorique, il serait intéressant de se demander si chaque programme peut être écrit de telle sorte que, vu sous forme de bitmap, vous voyiez réellement le code source qui fait la même chose. Si vous êtes sérieusement intéressé par de tels résultats, lisez par exemple à propos du théorème du point fixe de Kleene .

Le programme en tant qu'image peut également être vu comme une forme d'obfuscation de code. Pas que ce soit particulièrement pratique ...

6
osa