Как этот человек закодировал "Hello World" с Microsoft Paint?

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

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

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

Ответ 1

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

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

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

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

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

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


  • Есть сжатые DLE с RLE, но в этом случае используются несжатые растровые изображения (и они используются очень редко в любом случае).
  • За исключением шага, этого избегали, используя строки, состоящие из 4 байтов.

Ответ 2

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

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

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

Ответ 3

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

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