此人如何用Microsoft Paint编码“ Hello World”?


99

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

这是这个堆栈溢出问题的最高评价的答案为什么该程序被三个编译器拒绝?

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


7
位图值只是文件中的位。如果您将这些位解释为ASCii,则它将显示某些内容。仔细选择位,就可以在位图中写字母或构造(以文件头为模)。什么不明白?就像世界上最糟糕的编辑器一样,这只是一个愚蠢的事情。
Thomas M. DuBuisson

3
对于什么是价值,还有就是至少一个编程语言,其中的源代码被表示为图像。并不是说这个特定的图像可以使用它,而是...
Michael Madsen


6
动画GIF杀死了我的浏览器(IE和Chrome)-比动画GIF更好的发布视频的方法。
MusiGenesis 2011年

3
@MusiGenesis哦,我如何记得2011
Charles Clayton

Answers:


56

BMP(DIB)图像由标头和未压缩的1色数据组成(对于24 bpp图像,每个像素3字节,以反向行顺序存储,行距为4字节)。

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

在记事本中打开生成的文件时,颜色数据将显示为文本;否则,颜色数据将显示为文本。您仍然可以清楚地从标题(从BM文本到开头的部分)中看到文件格式所规定的内容。

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

但是请注意,用记事本手工制作整个产品并非没有可能-借助颜色选择器对话框,ASCII表和DIB格式的基本知识就可以完成,但这会慢得多并且容易出错。

有关DIB格式的更多信息


  1. 有RLE压缩的DIB,但在这种情况下,使用的是未压缩的位图(无论如何也很少使用它们)。
  2. 除了跨步,使用4字节的倍数行避免了这种情况。

19

我认为您是指愚人节问题之一的答案。

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

创建该程序的人必须已经为每个具有对应于每个字符的二进制表示形式的像素确定了颜色。


7
+1:最后,字节为字节。记事本将它们解释为文本字符,而mspaint将其解释为位图中的像素。前导的“垃圾”文本是其他图像信息(可能是分辨率,版本等之类的信息)。
克里斯·施米奇

6

从理论上的计算机科学的角度来看,有趣的是,是否可以以这样一种方式编写每个程序,使得以位图的形式查看时,实际上您看到的源代码可以执行相同的操作。如果您对这样的结果非常感兴趣,请阅读有关Kleene不动点定理的信息

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.