Bagaimana orang ini membuat kode "Hello World" dengan Microsoft Paint?

99

Saya baru saja melihat ini dalam beberapa hari terakhir dan tidak tahu cara kerjanya. Video yang saya bicarakan ada di sini :

Itu adalah jawaban teratas dari pertanyaan Stack Overflow ini: Mengapa program ini ditolak oleh tiga penyusun?

Bagaimana bitmap ini dapat menampilkan program C ++ untuk "Hello World"?

Eamonn O'Brien
sumber
7
nilai bitmap hanyalah bit dalam sebuah file. Jika Anda menafsirkan bit-bit tersebut sebagai ASCii maka itu akan menunjukkan sesuatu. Pemilihan bit yang cermat dan Anda dapat menulis surat, atau konstitusi, dalam bitmap (modulo file header). Apa yang tidak perlu dipahami? Itu hanya hal yang konyol, seperti editor terburuk di dunia.
Thomas M. DuBuisson
3
Untuk apa layak itu, ada adalah setidaknya satu bahasa pemrograman di mana kode sumber dinyatakan sebagai gambar. Bukannya gambar khusus ini akan berhasil, tapi ...
Michael Madsen
1
Utas yang Anda cari stackoverflow.com/questions/5508110/…
phwd
6
GIF animasi itu mematikan browser saya (IE dan Chrome) - ada cara yang lebih baik untuk memposting video daripada GIF animasi.
MusiGenesis
3
@MusiGenesis Oh, betapa saya mengingat masalah tahun 2011.
Charles Clayton

Jawaban:

56

Gambar BMP (DIB) disusun oleh header diikuti oleh data 1 warna yang tidak dikompresi (untuk gambar 24 bpp adalah 3 byte per piksel, disimpan dalam urutan baris terbalik dan dengan 4 byte baris langkah).

Byte untuk data warna digunakan untuk merepresentasikan warna (yaitu tidak satupun dari mereka yang "diamanatkan" oleh format file 2 , semuanya berasal dari warna setiap piksel), dan ada korespondensi 1: 1 yang sempurna antara warna piksel dan byte yang ditulis di dalam file; dengan demikian, dengan menggunakan warna yang dipilih dengan sempurna, Anda sebenarnya dapat menulis apa pun yang Anda inginkan dalam file (dengan pengecualian tajuk).

Saat Anda membuka file yang dihasilkan di notepad, data warna akan ditampilkan sebagai teks; Anda masih bisa melihat dengan jelas dari header (bagian dariBM awal teks), yang diamanatkan oleh format file.

Menurut pendapat saya, video ini dibuat dengan cara ini: pertama-tama penulis menghitung ukuran yang dibutuhkan untuk bitmap, dan membuat file DIB dengan ukuran yang benar yang diisi dengan warna yang meluas ke pola sederhana (mis. All bytes 65 => 'A'); lalu ganti pola seperti itu dengan kode "payload", seperti yang ditunjukkan di video.

Perhatikan bahwa bukan tidak mungkin untuk membuat semuanya dengan tangan dengan notepad - dengan dialog pemilih warna, tabel ASCII dan pengetahuan dasar tentang format DIB, hal itu dapat dilakukan, tetapi akan jauh lebih lambat dan rawan kesalahan.

Info lebih lanjut tentang format DIB


  1. Ada DIB terkompresi RLE, tetapi dalam kasus ini bitmap yang tidak dikompresi digunakan (dan bagaimanapun juga mereka jarang digunakan).
  2. Dengan pengecualian langkah, itu dihindari menggunakan beberapa baris 4 byte.
Matteo Italia
sumber
19

Saya berasumsi bahwa Anda mengacu pada jawaban atas salah satu pertanyaan April Mop.

Dugaan saya adalah bahwa setiap piksel memiliki representasi biner untuknya. Dan setiap karakter dalam kode sumber memiliki representasi biner untuknya.

Orang yang membuat program pasti telah menentukan warna untuk setiap piksel yang memiliki representasi biner yang sesuai dengan setiap karakter.

Andrew Grimm
sumber
7
+1: pada akhirnya, byte adalah byte. Notepad menafsirkannya sebagai karakter teks sementara mspaint menafsirkannya sebagai piksel dalam bitmap. Teks "sampah" utama adalah informasi gambar tambahan (mungkin hal-hal seperti resolusi, versi, dll.).
Chris Schmich
6

Dari sudut pandang ilmu komputer teoritis, akan menarik untuk bertanya, jika setiap program dapat ditulis sedemikian rupa sehingga, dipandang sebagai bitmap, Anda benar-benar melihat kode sumber yang melakukan hal yang sama. Jika Anda sangat tertarik dengan hasil seperti itu, baca misalnya tentang teorema titik tetap Kleene .

Program-sebagai-gambar juga dapat dilihat sebagai bentuk kebingungan kode. Bukannya itu praktis ...

osa
sumber