Как этот человек написал «Hello World» с помощью Microsoft Paint?

99

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

Это самый популярный ответ на вопрос о переполнении стека: почему эта программа была отклонена тремя компиляторами?

Как это растровое изображение может отображать программу C ++ для "Hello World"?

Имонн О'Брайен
источник
7
значения растрового изображения - это просто биты в файле. Если вы интерпретируете эти биты как ASCii, это что-то покажет. Тщательный выбор битов, и вы можете написать букву или состав в битовой карте (по модулю заголовка файла). Что не понимать? Это просто глупость, как худший редактор в мире.
Thomas M. DuBuisson
3
Для чего это стоит, то есть по крайней мере один язык программирования , исходный код выражается в виде изображения. Не то, чтобы этот конкретный образ сработал с ним, но ...
Майкл Мэдсен
1
Тема, которую
6
Этот анимированный GIF убивает мой браузер (IE и Chrome) - есть способы публиковать видео лучше, чем анимированный GIF.
MusiGenesis
3
@MusiGenesis Ох, как я помню проблемы 2011 года.
Чарльз Клейтон

Ответы:

56

Изображение BMP (DIB) состоит из заголовка, за которым следуют несжатые данные одного цвета (для изображений с разрешением 24 бит на пиксель это 3 байта на пиксель, хранящиеся в обратном порядке строк и с шагом строки 4 байта).

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

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

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

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

Подробнее о формате DIB


  1. Существуют сжатые DIB с помощью RLE, но в этом случае используются несжатые растровые изображения (и в любом случае они используются очень редко).
  2. За исключением шага, этого удалось избежать при использовании строк, кратных 4 байтам.
Маттео Италия
источник
19

Полагаю, вы имеете в виду ответ на один из первоапрельских вопросов.

Я предполагаю, что у каждого пикселя есть двоичное представление. И что каждый символ в исходном коде имеет двоичное представление.

Человек, создавший программу, должен был разработать цвет для каждого пикселя, который имел бы двоичное представление, соответствующее каждому символу.

Эндрю Гримм
источник
7
+1: в итоге байты - это байты. Блокнот интерпретирует их как символы текста, в то время как mspaint интерпретирует их как пиксели в растровом изображении. Ведущий «нежелательный» текст - это дополнительная информация об изображении (например, разрешение, версия и т. Д.).
Крис Шмич
6

С точки зрения теоретической информатики было бы интересно спросить, может ли каждая программа быть написана таким образом, чтобы, рассматривая ее как растровое изображение, вы действительно видели исходный код, который делает то же самое. Если вас серьезно интересуют такие результаты, прочтите, например, о теореме Клини о неподвижной точке .

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

Сергей Оршанский
источник