web-dev-qa-db-ja.com

この人はMicrosoft Paintで「Hello World」をどのようにコーディングしましたか?

私は過去数日以内にこれを見たばかりで、それがどのように機能するのか理解できません。私が話すビデオは ここ

最高評価の回答 このStack Overflowの質問から: なぜこのプログラムは3つのコンパイラーによって拒否されたのですか?

このビットマップは、「Hello World」のC++プログラムをどのように表示できますか?

97
Eamonn O'Brien

BMP(DIB)画像は、ヘッダーとそれに続く非圧縮で構成されます1 カラーデータ(24 bpp画像の場合、ピクセルあたり3バイトで、行の順序が逆で、行のストライドが4バイトです)。

色データのバイトは色を表すために使用されます(つまり、ファイル形式によって「強制」されているものはありません)2、それらはすべて各ピクセルの色から取得されます)、ピクセルの色とファイルに書き込まれたバイトの間には完全な1:1の対応があります。したがって、完全に選択された色を使用すると、ファイルに必要なものを実際に書き込むことができます(ヘッダーを除く)。

生成されたファイルをメモ帳で開くと、色データがテキストとして表示されます。ヘッダー(BMからテキストの先頭までの部分)から明確に見ることができます。これは、ファイル形式で義務付けられています。

私の意見では、このビデオはこの方法で行われました:最初に著者はビットマップに必要なサイズを計算し、単純なパターンに展開する色で満たされた正しいサイズのDIBファイルを作成しました(たとえば、すべてのバイト65 => 'A');次に、ビデオに示すように、このパターンを「ペイロード」コードに置き換えました。

ただし、メモ帳ですべてを手作りすることは不可能ではないことに注意してください-カラーチューザダイアログ、ASCIIテーブル、およびDIB形式の基本的な知識があれば、それを行うことができますが、はるかに遅く、エラーが発生しやすくなります。

DIB形式の詳細


  1. RLEで圧縮されたDIBがありますが、この場合、非圧縮のビットマップが使用されます(とにかくほとんど使用されません)。
  2. ストライドを除いて、4バイトの倍数行を使用することは回避されました。
55
Matteo Italia

あなたはエイプリルフールの質問への答えを参照していると思います。

私の推測では、各ピクセルにはバイナリ表現があります。また、ソースコードの各文字にはバイナリ表現があります。

プログラムを作成した人は、各文字に対応するバイナリ表現を持つ各ピクセルの色を考え出さなければなりません。

18
Andrew Grimm

理論的なコンピューターサイエンスの観点から見ると、すべてのプログラムがビットマップとして表示されるような方法で記述でき、実際に同じことを行うソースコードを見られるかどうかを尋ねることは興味深いでしょう。そのような結果に真剣に興味がある場合は、例えば Kleeneの不動点定理 について。

イメージとしてのプログラムは、コードの難読化の一形態として見ることもできます。特に実用的だったわけではない...

6
osa