此人是如何使用Microsoft Paint编写“Hello World”的?

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

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

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


一个BMP(DIB)图像由一个头部和一个未压缩的颜色数据组成(对于24个bpp图像,每个像素3个字节,以反向行顺序存储并且具有4个字节的行跨度)。

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

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

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

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

有关DIB格式的更多信息


  • 有RLE压缩的DIB,但是在这种情况下使用了未压缩的位图(并且它们很少被使用)。
  • 除了步幅之外,使用4个字节的倍数可以避免这种情况。

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

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

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


    从理论计算机科学的角度来看,问一个有趣的问题是,如果每一个程序都可以这样写,那么看起来就像位图一样,你实际上看到了执行同样事情的源代码。 如果您对这些结果非常感兴趣,请阅读例如Kleene的不动点定理。

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

    链接地址: http://www.djcxy.com/p/86299.html

    上一篇: How did this person code "Hello World" with Microsoft Paint?

    下一篇: Why can't my program compile under Windows 7 in French?