Як ця людина кодувала "Hello World" за допомогою Microsoft Paint?


99

Я щойно бачив це протягом останніх кількох днів і не можу зрозуміти, як це працює. Відео, про яке я говорю, тут :

Це найкращий відповідь на це запитання щодо переповнення стека: Чому цю програму три компілятори відхилили?

Як цей растровий файл може показати програму C ++ для "Hello World"?


7
Значення растрових зображень - це просто біти у файлі. Якщо ви інтерпретуєте ці біти як ASCii, то це щось покаже. Ретельний підбір бітів і ви можете написати лист або конституцію в растровій карті (за модулем заголовок файлу). Що не зрозуміти? Це просто дурна річ, як найгірший редактор у світі.
Thomas M. DuBuisson

3
Для чого це коштує, то є принаймні одна мова програмування , вихідний код виражається у вигляді зображення. Не те, щоб цей конкретний образ спрацював з цим, але ...
Майкл Мадсен


6
Цей анімований GIF вбиває мого браузера (IE та Chrome) - є кращі способи розміщення відео, ніж анімований GIF.
MusiGenesis

3
@MusiGenesis О, як я пам’ятаю проблеми 2011 року.
Чарльз Клейтон

Відповіді:


56

Зображення BMP (DIB) складається із заголовка з поданим нестисненим 1 кольоровим даним (для зображень на 24 bpp - це 3 байти на піксель, що зберігаються у зворотному порядку рядків та з 4-х байтним рядком).

Байти для кольорових даних використовуються для представлення кольорів (тобто жоден з них не "накладений" файлом у форматі 2 , всі вони походять від кольору кожного пікселя), і існує ідеальна відповідність 1: 1 між кольорами пікселів та записаними байтами у файлі; таким чином, використовуючи ідеально підібрані кольори, ви можете фактично записати все, що завгодно у файл (за винятком заголовка).

Коли ви відкриєте згенерований файл у блокноті, кольорові дані будуть відображатися у вигляді тексту; ви можете чітко бачити із заголовка (частини від BMпочатку тексту), що відповідає формату файлу.

На мою думку, це відео було зроблено таким чином: спершу автор підрахував розмір, необхідний для растрової карти, і створив файл DIB правильного розміру, наповнений кольором, який розширюється до простого шаблону (наприклад, всі байти 65 => 'A'); потім замінили такий зразок кодом "корисного навантаження", як показано на відео.

Однак зауважте, що вручну все це зробити за допомогою блокнота - за допомогою діалогового вікна вибору кольорів, таблиці ASCII та основних знань про формат DIB це можна зробити, але це буде набагато повільніше і схильним до помилок.

Детальніше про формат DIB


  1. Існують стиснуті RLE DIB, але в цьому випадку використовуються нестиснені растрові карти (і вони все-таки використовуються дуже рідко).
  2. За винятком кроку, цього не вдалося використовувати рядки, кратні по 4 байти.

19

Я припускаю, що ви маєте на увазі відповідь на одне із запитань у квітні.

Я здогадуюсь, що кожен піксель має двійкове представлення для нього. І що кожен символ у вихідному коді має для нього двійкове представлення.

Користувач, який створив програму, повинен був розробити колір для кожного пікселя, який повинен мати двійкове представлення, яке відповідатиме кожному символу.


7
+1: зрештою, байти - байти. Блокнот інтерпретує їх як символи тексту, тоді як mspaint інтерпретує їх як пікселі в растровій карті. Основним "непотрібним" текстом є додаткова інформація про зображення (можливо, такі речі, як роздільна здатність, версія тощо).
Кріс Шміч

6

З точки зору теоретичної інформатики, було б цікаво запитати, чи можна кожну програму записати таким чином, щоб, розглядаючи як растрову карту, ви насправді бачили вихідний код, який робить те саме. Якщо ви серйозно зацікавлені в таких результатах, прочитайте, наприклад, про теорему про фіксовану точку Клінова .

Програма як зображення також може розглядатися як форма обфускування коду. Не те, щоб це було особливо практично ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.