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

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

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

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


person Eamonn O'Brien    schedule 07.04.2011    source источник
comment
@ Закрыть избиратель: Почему это не настоящий вопрос? Есть объективный ответ.   -  person Andrew Grimm    schedule 08.04.2011
comment
значения растрового изображения - это просто биты в файле. Если вы интерпретируете эти биты как ASCii, это что-то покажет. Тщательный выбор битов, и вы можете написать букву или состав в растровом изображении (по модулю заголовка файла). Что не понимать? Это просто глупость, как худший редактор в мире.   -  person Thomas M. DuBuisson    schedule 08.04.2011
comment
Очевидно, этот человек просто использует усовершенствованный язык программирования Whitespace.   -  person MusiGenesis    schedule 08.04.2011
comment
Как бы то ни было, существует как минимум один язык программирования где исходный код выражен в виде изображения. Не то чтобы этот конкретный образ с ним работал, но ...   -  person Michael Madsen    schedule 08.04.2011
comment
Тема, которую вы искали stackoverflow.com/questions/5508110/   -  person phwd    schedule 09.04.2011
comment
Этот анимированный GIF убивает мой браузер (IE и Chrome) - есть способы публиковать видео лучше, чем анимированный GIF.   -  person MusiGenesis    schedule 10.04.2011
comment
Я сделал несколько таких, вам просто нужно заполнить изображение, достаточно большое, чтобы вместить все символы, а затем просто используйте шестнадцатеричный редактор, чтобы вставить их.   -  person    schedule 11.04.2011
comment
@MusiGenesis Ох, как я помню проблемы 2011 года.   -  person Charles Clayton    schedule 20.11.2015
comment
Если программа написана на C ++, почему вы добавили тег C? (C - другой язык)   -  person Toby    schedule 11.08.2017


Ответы (3)


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

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

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

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

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

Дополнительная информация о формате DIB


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

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

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

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

person Andrew Grimm    schedule 07.04.2011
comment
+1: в итоге байты - это байты. Блокнот интерпретирует их как символы текста, в то время как mspaint интерпретирует их как пиксели в растровом изображении. Ведущий нежелательный текст - это дополнительная информация об изображении (например, разрешение, версия и т. Д.). - person Chris Schmich; 08.04.2011

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

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

person Sergey Orshanskiy    schedule 09.10.2013