W jaki sposób ta osoba zakodowała „Hello World” w programie Microsoft Paint?

99

Widziałem to w ciągu ostatnich kilku dni i nie mogę dowiedzieć się, jak to działa. Film, o którym mówię, jest tutaj :

To najwyżej oceniana odpowiedź na pytanie dotyczące przepełnienia stosu: Dlaczego ten program został odrzucony przez trzy kompilatory?

W jaki sposób ta mapa bitowa może pokazać program C ++ dla „Hello World”?

Eamonn O'Brien
źródło
7
wartości bitmap to po prostu bity w pliku. Jeśli zinterpretujesz te bity jako ASCii, to coś pokaże. Ostrożny dobór bitów i możesz wpisać literę lub konstytucję w bitmapie (modulo nagłówek pliku). Czego nie rozumiem? To po prostu głupia rzecz, jak najgorszy redaktor na świecie.
Thomas M. DuBuisson,
3
Co więcej, jest co najmniej jeden język programowania, w którym kod źródłowy jest wyrażony jako obraz. Nie żeby ten konkretny obraz z nim działał, ale ...
Michael Madsen,
1
Wątek, którego szukałeś stackoverflow.com/questions/5508110/ ...
phwd
6
Ten animowany GIF zabija moją przeglądarkę (IE i Chrome) - są lepsze sposoby na publikowanie filmów niż animowany GIF.
MusiGenesis,
3
@MusiGenesis Och, jak pamiętam problemy z 2011 roku.
Charles Clayton

Odpowiedzi:

56

Obraz BMP (DIB) składa się z nagłówka, po którym następują nieskompresowane 1 dane koloru (dla obrazów o rozdzielczości 24 bpp są to 3 bajty na piksel, przechowywane w odwrotnej kolejności i z 4-bajtowym krokiem między wierszami).

Bajty dla danych koloru są używane do reprezentowania kolorów (tj. Żaden z nich nie jest „narzucony” przez format pliku 2 , wszystkie pochodzą z koloru każdego piksela) i istnieje idealna zgodność 1: 1 między kolorami pikseli a zapisanymi bajtami w pliku; w ten sposób, używając idealnie dobranych kolorów, możesz faktycznie zapisać w pliku wszystko, co chcesz (z wyjątkiem nagłówka).

Gdy otworzysz wygenerowany plik w notatniku, dane koloru zostaną pokazane jako tekst; nadal możesz wyraźnie zobaczyć z nagłówka (części od BMdo początku tekstu), co jest wymagane przez format pliku.

Moim zdaniem to wideo zostało zrobione w ten sposób: najpierw autor obliczył wymagany rozmiar bitmapy i stworzył plik DIB o odpowiednim rozmiarze wypełniony kolorem, który rozwija się do prostego wzoru (np. Wszystkie bajty 65 => 'A'); następnie zastąpił taki wzorzec kodem „ładunku”, jak pokazano na filmie.

Zauważ jednak, że nie jest niemożliwe ręczne wykonanie całości za pomocą notatnika - z oknem wyboru kolorów, tabelą ASCII i podstawową znajomością formatu DIB można to zrobić, ale byłoby to znacznie wolniejsze i podatne na błędy.

Więcej informacji o formacie DIB


  1. Istnieją skompresowane RLE DIB, ale w tym przypadku używane są nieskompresowane bitmapy (a i tak są one używane naprawdę rzadko).
  2. Z wyjątkiem kroku, uniknięto tego, używając wierszy wielokrotności 4 bajtów.
Matteo Italia
źródło
19

Zakładam, że odnosisz się do odpowiedzi na jedno z pytań primaaprilisowych.

Domyślam się, że każdy piksel ma reprezentację binarną. I że każdy znak w kodzie źródłowym ma reprezentację binarną.

Osoba, która stworzyła program, musiała wypracować kolor dla każdego piksela, który miałby binarną reprezentację odpowiadającą każdemu znakowi.

Andrew Grimm
źródło
7
+1: w końcu bajty to bajty. Notatnik interpretuje je jako znaki tekstu, podczas gdy mspaint interpretuje je jako piksele w bitmapie. Wiodący „śmieciowy” tekst to dodatkowe informacje o obrazie (np. Rozdzielczość, wersja itp.).
Chris Schmich,
6

Z teoretycznego punktu widzenia informatyki, byłoby interesujące zapytać, czy każdy program można napisać w taki sposób, aby postrzegany jako bitmapa faktycznie widział kod źródłowy, który robi to samo. Jeśli jesteś poważnie zainteresowany takimi wynikami, przeczytaj np. O twierdzeniu Kleene'a o punkcie stałym .

Program jako obraz może być również postrzegany jako forma zaciemniania kodu. Nie żeby było to szczególnie praktyczne ...

osa
źródło