这个人怎么用Microsoft Paint编写“Hello World”代码?

时间:2011-04-07 23:04:50

标签: c++ c paint

我刚刚在过去几天看到这一点,无法弄清楚它是如何运作的。我谈到的视频是here

来自此Stack Overflow问题的the top rated answerWhy was this program rejected by three compilers?

这个位图如何能够显示“Hello World”的C ++程序?

3 个答案:

答案 0 :(得分:54)

BMP(DIB)图像由标题后跟未压缩的 1 颜色数据组成(对于24 bpp图像,每个像素3个字节,以反向行顺序存储,并且具有4个字节的行间距)

颜色数据的字节用于表示颜色(即它们都不是由文件格式 2 “强制”,它们都来自每个像素的颜色),并且有一个完美的颜色像素颜色与文件中写入的字节之间的1:1对应关系;因此,使用完美选择的颜色,您实际上可以在文件中写入任何内容(标题除外)。

在记事本中打开生成的文件时,颜色数据将显示为文本;您仍然可以从标题(从BM到文本开头的部分)清楚地看到,这是由文件格式强制执行的。

在我看来,这个视频是这样完成的:首先作者计算了位图所需的大小,并创建了一个正确大小的DIB文件,其中填充的颜色扩展为简单模式(例如,所有字节65 => ; 'A');然后用“有效载荷”代码替换这种模式,如视频所示。

请注意,使用记事本手工制作整个东西并非不可能 - 使用颜色选择器对话框,ASCII表和DIB格式的基本知识可以完成,但它会慢很多并且出错易发。

More info about the DIB format


  1. 有RLE压缩的DIB,但在这种情况下使用了未压缩的位图(并且它们很少用于它们)。
  2. 除了步幅之外,使用4个字节的多个行​​来避免这种情况。

答案 1 :(得分:18)

我假设你指的是愚人节问题之一的答案。

我的猜测是每个像素都有一个二进制表示。并且源代码中的每个字符都有一个二进制表示。

创建程序的人必须为每个具有与每个字符对应的二进制表示的像素计算出颜色。

答案 2 :(得分:6)

从理论计算机科学的角度来看,如果每个程序都能以这样的方式编写,以便作为位图查看,您实际上看到了执行相同操作的源代码,那将会很有趣。如果您对此类结果非常感兴趣,请阅读关于Kleene's fixed point theorem

作为图像编程也可以被视为代码混淆的一种形式。并不是说它特别实用......