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

99

Je viens de voir cela au cours des derniers jours et je ne peux pas comprendre comment cela fonctionne. La vidéo dont je parle est ici :

C'est la réponse la mieux notée à cette question de Stack Overflow: pourquoi ce programme a-t-il été rejeté par trois compilateurs?

Comment ce bitmap est-il capable d'afficher un programme C ++ pour "Hello World"?

Eamonn O'Brien
la source
7
Les valeurs bitmap ne sont que des bits dans un fichier. Si vous interprétez ces bits comme ASCii, cela affichera quelque chose. Sélection minutieuse des bits et vous pouvez écrire une lettre, ou la constitution, dans un bitmap (modulo l'en-tête du fichier). Qu'est-ce qu'il ne faut pas comprendre? C'est juste une chose stupide, comme le pire éditeur du monde.
Thomas M. DuBuisson
3
Pour ce que ça vaut, il existe au moins un langage de programmation où le code source est exprimé sous forme d'image. Non pas que cette image en particulier fonctionnerait avec elle, mais ...
Michael Madsen
1
Le fil de discussion que vous recherchiez stackoverflow.com/questions/5508110/…
phwd
6
Ce GIF animé tue mon navigateur (IE et Chrome) - il existe de meilleures façons de publier des vidéos qu'un GIF animé.
MusiGenesis
3
@MusiGenesis Oh, comment je me souviens des problèmes de 2011.
Charles Clayton

Réponses:

56

Une image BMP (DIB) est composée d'un en-tête suivi de 1 non compressé données de couleur (pour des images de 24 bpp, il s'agit de 3 octets par pixel, stockés dans l'ordre inverse des lignes 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'entre eux n'est "mandaté" par le format de fichier 2 , ils proviennent tous de la couleur de chaque pixel), et il y a une correspondance 1: 1 parfaite entre les couleurs des pixels et les octets écrits dans le fichier; ainsi, en utilisant des couleurs parfaitement choisies, vous pouvez en fait é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 seront affichées sous forme de texte; vous pouvez toujours voir clairement à partir de l'en-tête (la partie du BMdébut du texte), qui est mandaté par le format de fichier.

À mon avis, cette vidéo a été réalisée de cette façon: d'abord, l'auteur a calculé la taille nécessaire pour le bitmap, et a créé un fichier DIB de la taille correcte rempli d'une couleur qui se développe en un motif simple (par exemple, tous les octets 65 => 'A' ); puis 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 de sélection de couleur, une table ASCII et une connaissance de base du format DIB, cela peut être fait, mais ce serait beaucoup plus lent et sujet aux erreurs.

Plus d'informations sur le format DIB


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

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

Je suppose que chaque pixel a une représentation binaire pour lui. Et que chaque caractère du code source a une représentation binaire pour lui.

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

Andrew Grimm
la source
7
+1: au final, les octets sont des octets. Notepad les interprète comme des caractères de texte tandis que mspaint les interprète comme des pixels dans un bitmap. Le premier texte "indésirable" est des informations supplémentaires sur l'image (éventuellement des choses comme la résolution, la version, etc.).
Chris Schmich
6

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

Program-as-an-image peut également être considéré comme une forme d'obfuscation de code. Non pas que ce soit particulièrement pratique ...

osa
la source