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

Eam*_*ien 97 c c++ paint

我刚刚在过去几天看到这一点,无法弄清楚它是如何工作的.我谈到的视频在这里:

这是Stack Overflow问题的最高评价答案:为什么这个程序被三个编译器拒绝了?

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

Mat*_*lia 55

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

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

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

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

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

有关DIB格式的更多信息


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


And*_*imm 18

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

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

创建程序的人必须已经计算出每个像素的颜色,这些像素具有与每个字符相对应的二进制表示.

  • +1:最后,字节是字节.记事本将它们解释为文本字符,而mspaint将它们解释为位图中的像素.领先的"垃圾"文本是附加的图像信息(可能是分辨率,版本等). (7认同)

osa*_*osa 6

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

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