这个人是如何用Microsoft Paint编写“Hello World”的?
我刚才在这几天看到了这个,不知道它是如何工作的。 我讲的video在这里 :
这是来自这个堆栈溢出问题的最高评价答案 : 为什么这个程序被三个编译器拒绝?
这个位图如何能够显示“Hello World”的C ++程序?
一个BMP(DIB)图像由一个头部组成,后跟未压缩的1个彩色数据(对于24bpp图像,每个像素3个字节,以反向行顺序存储,4个字节行跨度)。
颜色数据的字节被用于表示颜色(即,它们都不是由文件格式2 “强制”的,它们都来自每个像素的颜色),并且在像素颜色和写入的字节之间存在完美的1:1对应在文件中; 因此,使用完美select的颜色,您实际上可以在文件中写入任何您想要的内容(不包括标题)。
当您在记事本中打开生成的文件时,颜色数据将显示为文本; 您仍然可以从标题(从BM
到文本的开头的部分)清楚地看到,这是由文件格式规定的。
在我看来,这个video是这样完成的:首先,作者计算了位图所需的大小,并创build了一个正确大小的DIB文件,并填充了一个可扩展为简单模式的颜色(例如,所有字节65 => 'A'
); 然后用“有效载荷”代码replace这种模式,如video所示。
不过要注意的是,用记事本手工制作整个东西并不是不可能的 – 使用颜色select器对话框,一个ASCII表格和DIB格式的基本知识就可以完成,但是它会慢很多,并且容易出错。
有关DIB格式的更多信息
- 有RLE压缩的DIB,但是在这种情况下,使用了未压缩的位图(而且很less使用它们)。
- 除了步幅之外,使用4字节的倍数来避免这种情况。
我假设你指的是愚人节问题之一的答案。
我的猜测是每个像素都有一个二进制表示。 而且源代码中的每个字符都有一个二进制表示。
创build该程序的人必须为每个像素计算出具有与每个字符对应的二进制表示的颜色。
从理论计算机科学的angular度来看,有趣的是,如果每一个程序都可以用这样的方式写成,那么看起来就像是一个位图,你实际上看到了源代码也是一样的。 如果您对这样的结果非常感兴趣,请阅读例如Kleene的不动点定理 。
程序作为图像也可以被视为代码混淆的一种forms。 并不是说它特别实用