Người này đã viết mã “Hello World” bằng Microsoft Paint như thế nào?


99

Tôi vừa thấy điều này trong vòng vài ngày qua và không thể tìm ra cách nó hoạt động. Video tôi nói đến là ở đây :

Đó là câu trả lời được xếp hạng cao nhất từ câu hỏi Stack Overflow này: Tại sao chương trình này bị ba trình biên dịch từ chối?

Làm cách nào để bitmap này có thể hiển thị một chương trình C ++ cho "Hello World"?


7
giá trị bitmap chỉ là các bit trong một tệp. Nếu bạn giải thích các bit đó là ASCii thì nó sẽ hiển thị một cái gì đó. Lựa chọn cẩn thận các bit và bạn có thể viết một chữ cái, hoặc hiến pháp, dưới dạng bitmap (mô-đun hóa tiêu đề tệp). Điều gì không hiểu? Nó chỉ là một điều ngớ ngẩn, giống như trình biên tập tồi tệ nhất thế giới.
Thomas M. DuBuisson

3
Đối với những gì nó có giá trị, có ít nhất một ngôn ngữ lập trình mà mã nguồn được thể hiện như một hình ảnh. Không phải hình ảnh cụ thể này sẽ hoạt động với nó, nhưng ...
Michael Madsen

1
Chủ đề bạn đang tìm kiếm stackoverflow.com/questions/5508110/…
phwd

6
GIF động đó đang giết chết trình duyệt của tôi (IE và Chrome) - có nhiều cách tốt hơn để đăng video hơn là GIF động.
MusiGenesis

3
@MusiGenesis Ôi, tôi nhớ các vấn đề của năm 2011.
Charles Clayton

Câu trả lời:


56

Hình ảnh BMP (DIB) được tạo bởi một tiêu đề theo sau là dữ liệu 1 màu không nén (đối với hình ảnh 24 bpp, đó là 3 byte trên mỗi pixel, được lưu trữ theo thứ tự hàng ngược lại và với khoảng cách hàng 4 byte).

Các byte cho dữ liệu màu được sử dụng để đại diện cho màu sắc (tức là không có byte nào trong số chúng được "bắt buộc" bởi định dạng tệp 2 , tất cả đều đến từ màu của mỗi pixel) và có sự tương ứng 1: 1 hoàn hảo giữa màu pixel và byte được viết trong file; do đó, bằng cách sử dụng các màu được chọn hoàn hảo, bạn thực sự có thể viết bất cứ thứ gì bạn muốn vào tệp (ngoại trừ tiêu đề).

Khi bạn mở tệp được tạo trong notepad, dữ liệu màu sẽ được hiển thị dưới dạng văn bản; bạn vẫn có thể thấy rõ từ tiêu đề (phần từ đầu BMđến đầu văn bản), được định dạng tệp bắt buộc.

Theo tôi video này được thực hiện theo cách này: đầu tiên tác giả tính toán kích thước cần thiết cho bitmap và tạo một tệp DIB có kích thước chính xác được tô bằng màu mở rộng thành một mẫu đơn giản (ví dụ: tất cả các byte 65 => 'A'); sau đó thay thế mẫu đó bằng mã "tải trọng", như được hiển thị trong video.

Tuy nhiên, hãy lưu ý rằng không phải là không thể tạo thủ công toàn bộ bằng notepad - với hộp thoại chọn màu, bảng ASCII và kiến ​​thức cơ bản về định dạng DIB, bạn có thể thực hiện thủ công này, nhưng sẽ chậm hơn nhiều và dễ xảy ra lỗi.

Thông tin thêm về định dạng DIB


  1. Có các DIB được nén RLE, nhưng trong trường hợp này, các bitmap không nén được sử dụng (và dù sao thì chúng cũng rất hiếm khi được sử dụng).
  2. Ngoại trừ sải chân, điều đó đã được tránh sử dụng các hàng nhiều 4 byte.

19

Tôi cho rằng bạn đang đề cập đến câu trả lời cho một trong những câu hỏi Ngày Cá tháng Tư.

Tôi đoán là mỗi pixel có một biểu diễn nhị phân cho nó. Và mỗi ký tự trong mã nguồn có một đại diện nhị phân cho nó.

Người tạo ra chương trình phải tìm ra màu sắc cho mỗi pixel sẽ có biểu diễn nhị phân tương ứng với mỗi ký tự.


7
+1: cuối cùng, byte là byte. Notepad diễn giải chúng dưới dạng các ký tự của văn bản trong khi mspaint diễn giải chúng dưới dạng pixel trong một bitmap. Văn bản "rác" ở đầu là thông tin hình ảnh bổ sung (có thể là những thứ như độ phân giải, phiên bản, v.v.).
Chris Schmich

6

Từ quan điểm khoa học máy tính lý thuyết, sẽ rất thú vị nếu đặt câu hỏi, nếu mọi chương trình có thể được viết theo cách như vậy, được xem như một bitmap, bạn thực sự đã thấy mã nguồn làm được điều tương tự. Nếu bạn thực sự quan tâm đến các kết quả như vậy, hãy đọc ví dụ về định lý điểm cố định của Kleene .

Program-as-an-image cũng có thể được xem như là một hình thức làm xáo trộn mã. Không phải nó đặc biệt thực tế ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.