【问题标题】:How did this person code "Hello World" with Microsoft Paint?此人如何使用 Microsoft Paint 编写“Hello World”代码?
【发布时间】:2011-08-01 02:41:58
【问题描述】:

我最近几天才看到这个,不知道它是如何工作的。我讲的视频是here

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

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

【问题讨论】:

  • 位图值只是文件中的位。如果您将这些位解释为 ASCii,那么它将显示一些内容。仔细选择位,您可以在位图中写一个字母或宪法(以文件头为模)。有什么不明白的?这简直就是一件傻事,就像世界上最糟糕的编辑一样。
  • 对于它的价值,至少有 one programming language 将源代码表示为图像。并不是说这个特定的图像可以使用它,但是......
  • 动画 GIF 正在扼杀我的浏览器(IE 和 Chrome) - 发布视频的方式比动画 GIF 更好。
  • @MusiGenesis 哦,我怎么记得 2011 年的问题。

标签: c++ c paint


【解决方案1】:

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 字节的倍数行避免了这一点。

【讨论】:

    【解决方案2】:

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

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

    创建程序的人一定已经计算出每个像素的颜色,每个像素都有对应于每个字符的二进制表示。

    【讨论】:

    • +1:最后,字节就是字节。记事本将它们解释为文本字符,而 mspaint 将它们解释为位图中的像素。前面的“垃圾”文本是附加的图像信息(可能是分辨率、版本等)。
    【解决方案3】:

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

    Program-as-an-image 也可以被视为一种代码混淆形式。并不是说它特别实用……

    【讨论】:

      猜你喜欢
      • 2012-08-18
      • 2012-12-16
      • 2010-11-04
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多