บุคคลนี้เขียนโค้ด“ Hello World” ด้วย Microsoft Paint ได้อย่างไร


99

ฉันเพิ่งเห็นสิ่งนี้ภายในไม่กี่วันที่ผ่านมาและไม่สามารถเข้าใจได้ว่ามันทำงานอย่างไร วิดีโอที่ฉันพูดถึงอยู่ที่นี่ :

เป็นคำตอบยอดนิยมจากคำถาม Stack Overflow: เหตุใดโปรแกรมนี้จึงถูกคอมไพเลอร์สามตัวปฏิเสธ

บิตแมปนี้สามารถแสดงโปรแกรม C ++ สำหรับ "Hello World" ได้อย่างไร


7
ค่าบิตแมปเป็นเพียงบิตในไฟล์ หากคุณตีความบิตเหล่านั้นเป็น ASCii มันจะแสดงอะไรบางอย่าง การเลือกบิตอย่างรอบคอบและคุณสามารถเขียนจดหมายหรือรัฐธรรมนูญในบิตแมป (โมดูโลส่วนหัวของไฟล์) ไม่เข้าใจอะไร มันเป็นเรื่องโง่ ๆ เช่นบรรณาธิการที่แย่ที่สุดในโลก
Thomas M. DuBuisson

3
สำหรับสิ่งที่มันคุ้มค่าที่มีเป็นอย่างน้อยการเขียนโปรแกรมภาษาหนึ่งที่รหัสที่มาแสดงเป็นภาพ ไม่ใช่ว่าภาพนี้จะใช้ได้กับมัน แต่ ...
Michael Madsen

1
กระทู้ที่คุณกำลังมองหาstackoverflow.com/questions/5508110/…
phwd

6
GIF แบบเคลื่อนไหวนั้นฆ่าเบราว์เซอร์ของฉัน (IE และ Chrome) - มีวิธีที่ดีกว่าในการโพสต์วิดีโอมากกว่า GIF แบบเคลื่อนไหว
MusiGenesis

3
@MusiGenesis โอ้ฉันจำปัญหาของปี 2011 ได้อย่างไร
Charles Clayton

คำตอบ:


56

รูปภาพ BMP (DIB) ประกอบด้วยส่วนหัวตามด้วยข้อมูลสี1สีที่ไม่มีการบีบอัด(สำหรับภาพ 24 bpp จะมีขนาด 3 ไบต์ต่อพิกเซลโดยจัดเก็บในลำดับแถวย้อนกลับและมีการก้าวข้ามแถว 4 ไบต์)

ไบต์สำหรับข้อมูลสีถูกใช้เพื่อแสดงสี (กล่าวคือไม่มีการ "บังคับ" โดยรูปแบบไฟล์2ทั้งหมดมาจากสีของแต่ละพิกเซล) และมีความสอดคล้องกัน 1: 1 ที่สมบูรณ์แบบระหว่างสีพิกเซลและไบต์ที่เขียน ในไฟล์; ดังนั้นการใช้สีที่เลือกอย่างสมบูรณ์คุณสามารถเขียนอะไรก็ได้ที่คุณต้องการในไฟล์ (ยกเว้นส่วนหัว)

เมื่อคุณเปิดไฟล์ที่สร้างขึ้นในแผ่นจดบันทึกข้อมูลสีจะแสดงเป็นข้อความ คุณยังสามารถเห็นได้อย่างชัดเจนจากส่วนหัว (ส่วนจากBMถึงจุดเริ่มต้นของข้อความ) ซึ่งได้รับคำสั่งจากรูปแบบไฟล์

ในความคิดของฉันวิดีโอนี้ทำด้วยวิธีนี้: ก่อนอื่นผู้เขียนคำนวณขนาดที่จำเป็นสำหรับบิตแมปและสร้างไฟล์ DIB ในขนาดที่ถูกต้องซึ่งเต็มไปด้วยสีที่ขยายเป็นรูปแบบง่ายๆ (เช่นไบต์ทั้งหมด 65 => 'A' ); จากนั้นแทนที่รูปแบบดังกล่าวด้วยรหัส "payload" ดังที่แสดงในวิดีโอ

อย่างไรก็ตามโปรดสังเกตว่ามันเป็นไปไม่ได้เลยที่จะประดิษฐ์สิ่งของทั้งหมดด้วย notepad ด้วยกล่องโต้ตอบตัวเลือกสีตาราง ASCII และความรู้พื้นฐานเกี่ยวกับรูปแบบ DIB ที่สามารถทำได้ แต่มันจะช้ากว่ามากและเกิดข้อผิดพลาดได้ง่าย

ข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบ DIB


  1. มี RLE ที่บีบอัด DIB แต่ในกรณีนี้จะใช้บิตแมปที่ไม่บีบอัด (และจะใช้ไม่ค่อยได้จริง ๆ )
  2. ยกเว้นการก้าวย่างที่หลีกเลี่ยงการใช้แถวที่มีหลาย 4 ไบต์

19

ฉันคิดว่าคุณกำลังอ้างถึงคำตอบของหนึ่งในคำถาม April Fools

ฉันเดาว่าแต่ละพิกเซลมีการแทนค่าไบนารี และอักขระแต่ละตัวในซอร์สโค้ดมีการแทนค่าไบนารี

ผู้ที่สร้างโปรแกรมจะต้องกำหนดสีสำหรับแต่ละพิกเซลที่มีการแทนค่าไบนารีที่สอดคล้องกับอักขระแต่ละตัว


7
+1: ในที่สุดไบต์ก็คือไบต์ Notepad ตีความเป็นอักขระของข้อความในขณะที่ mspaint แปลเป็นพิกเซลในบิตแมป ข้อความ "ขยะ" นำหน้าคือข้อมูลรูปภาพเพิ่มเติม (อาจเป็นเช่นความละเอียดเวอร์ชัน ฯลฯ )
Chris Schmich

6

จากมุมมองของวิทยาศาสตร์คอมพิวเตอร์เชิงทฤษฎีเป็นเรื่องที่น่าสนใจที่จะถามว่าหากทุกโปรแกรมสามารถเขียนในลักษณะนี้เพื่อให้มองเป็นบิตแมปคุณได้เห็นซอร์สโค้ดที่ทำสิ่งเดียวกัน หากคุณสนใจผลลัพธ์ดังกล่าวอย่างจริงจังโปรดอ่านเช่นเกี่ยวกับทฤษฎีบทจุดตายตัวของคลี

Program-as-an-image ยังสามารถมองได้ว่าเป็นรูปแบบของการทำให้โค้ดสับสน ไม่ใช่ว่ามันใช้ได้จริง ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.