Wie hat diese Person "Hello World" mit Microsoft Paint codiert?

99

Ich habe das gerade in den letzten Tagen gesehen und kann nicht herausfinden, wie es funktioniert. Das Video, über das ich spreche, ist hier :

Dies ist die am besten bewertete Antwort auf diese Frage zum Stapelüberlauf: Warum wurde dieses Programm von drei Compilern abgelehnt?

Wie kann diese Bitmap ein C ++ - Programm für "Hello World" anzeigen?

Eamonn O'Brien
quelle
7
Bitmap-Werte sind nur Bits in einer Datei. Wenn Sie diese Bits als ASCii interpretieren, wird etwas angezeigt. Durch sorgfältige Auswahl der Bits können Sie einen Buchstaben oder die Konstitution in eine Bitmap schreiben (Modulo des Dateikopfs). Was ist nicht zu verstehen? Es ist nur eine dumme Sache, wie der schlechteste Editor der Welt.
Thomas M. DuBuisson
3
Für das, was es wert ist, gibt es mindestens eine Programmiersprache, in der der Quellcode als Bild ausgedrückt wird. Nicht dass dieses bestimmte Bild damit funktionieren würde, aber ...
Michael Madsen
1
Der Thread, den Sie gesucht haben stackoverflow.com/questions/5508110/…
phwd
6
Dieses animierte GIF bringt meinen Browser (IE und Chrome) um - es gibt bessere Möglichkeiten, Videos zu posten als ein animiertes GIF.
MusiGenesis
3
@MusiGenesis Oh, wie ich mich an die Probleme von 2011 erinnere.
Charles Clayton

Antworten:

56

Ein BMP (DIB) -Bild besteht aus einem Header, gefolgt von unkomprimierten 1- Farbdaten (für 24-bpp-Bilder sind es 3 Bytes pro Pixel, die in umgekehrter Zeilenreihenfolge und mit 4 Bytes Zeilenschritt gespeichert sind).

Die Bytes für Farbdaten werden zur Darstellung von Farben verwendet (dh keines von ihnen wird vom Dateiformat 2 "vorgeschrieben" , sie stammen alle aus der Farbe jedes Pixels), und es besteht eine perfekte 1: 1-Entsprechung zwischen Pixelfarben und geschriebenen Bytes in der Datei; Mit perfekt ausgewählten Farben können Sie also tatsächlich alles, was Sie wollen, in die Datei schreiben (mit Ausnahme des Headers).

Wenn Sie die generierte Datei im Editor öffnen, werden die Farbdaten als Text angezeigt. Sie können immer noch deutlich an der Kopfzeile (dem Teil vom BMAnfang des Textes) erkennen, die vom Dateiformat vorgegeben wird.

Meiner Meinung nach wurde dieses Video folgendermaßen erstellt: Zuerst berechnete der Autor die für die Bitmap erforderliche Größe und erstellte eine DIB-Datei mit der richtigen Größe, die mit einer Farbe gefüllt ist, die sich zu einem einfachen Muster erweitert (z. B. alle Bytes 65 => 'A'). Ersetzte dann ein solches Muster durch den "Nutzlast" -Code, wie im Video gezeigt.

Beachten Sie jedoch, dass es nicht unmöglich ist, das Ganze mit dem Editor von Hand zu gestalten - mit dem Farbauswahldialog, einer ASCII-Tabelle und Grundkenntnissen des DIB-Formats ist dies möglich, aber es wäre viel langsamer und fehleranfälliger.

Weitere Infos zum DIB-Format


  1. Es gibt RLE-komprimierte DIBs, aber in diesem Fall werden unkomprimierte Bitmaps verwendet (und sie werden sowieso sehr selten verwendet).
  2. Mit Ausnahme des Schrittes wurde die Verwendung von Zeilen mit einem Vielfachen von 4 Bytes vermieden.
Matteo Italia
quelle
19

Ich nehme an, Sie beziehen sich auf die Antwort auf eine der Aprilscherz-Fragen.

Ich vermute, dass jedes Pixel eine binäre Darstellung hat. Und dass jedes Zeichen im Quellcode eine binäre Darstellung hat.

Die Person, die das Programm erstellt hat, muss die Farbe für jedes Pixel ermittelt haben, das eine binäre Darstellung hat, die jedem Zeichen entspricht.

Andrew Grimm
quelle
7
+1: Am Ende sind Bytes Bytes. Notepad interpretiert sie als Textzeichen, während mspaint sie als Pixel in einer Bitmap interpretiert. Der führende "Junk" -Text enthält zusätzliche Bildinformationen (möglicherweise Auflösung, Version usw.).
Chris Schmich
6

Aus theoretischer Informatik wäre es interessant zu fragen, ob jedes Programm so geschrieben werden kann, dass Sie als Bitmap tatsächlich den Quellcode sehen, der dasselbe tut. Wenn Sie ernsthaft an solchen Ergebnissen interessiert sind, lesen Sie zB den Fixpunktsatz von Kleene .

Das Programm als Bild kann auch als eine Form der Codeverschleierung angesehen werden. Nicht dass es besonders praktisch gewesen wäre ...

osa
quelle