ทำไมคุณไม่เห็นรหัสไบนารีเมื่อคุณเปิดไฟล์ไบนารีด้วยโปรแกรมแก้ไขข้อความ? ตัวอย่างเช่นเมื่อฉันเปิดภาพด้วยโปรแกรมแก้ไขข้อความฉันเห็นตัวละครแปลก ๆ และตัวละครที่มนุษย์อ่านได้ แต่รูปภาพควรเข้ารหัสในรูปแบบไบนารี
ทำไมคุณไม่เห็นรหัสไบนารีเมื่อคุณเปิดไฟล์ไบนารีด้วยโปรแกรมแก้ไขข้อความ? ตัวอย่างเช่นเมื่อฉันเปิดภาพด้วยโปรแกรมแก้ไขข้อความฉันเห็นตัวละครแปลก ๆ และตัวละครที่มนุษย์อ่านได้ แต่รูปภาพควรเข้ารหัสในรูปแบบไบนารี
คำตอบ:
ไบนารีและข้อความข้อมูลจะถูกแยกออกจากกันไม่ได้: พวกเขาเป็นเพียงข้อมูล ขึ้นอยู่กับการตีความที่ทำให้พวกเขาหนึ่งหรืออื่น ๆ หากคุณเปิดข้อมูลไบนารี (เช่นไฟล์รูปภาพ) ในโปรแกรมแก้ไขข้อความส่วนใหญ่จะไม่สมเหตุสมผลเพราะมันไม่เหมาะกับการตีความที่คุณเลือก(เช่นข้อความ)
สิ่งที่คุณเรียกว่าข้อความเป็นส่วนย่อยของเนื้อหาไฟล์ที่เป็นไปได้: ข้อมูลที่อยู่ในชุดอักขระที่กำหนดแปลเป็นอักขระที่อ่านได้
ยกตัวอย่างเช่นในASCII , คุณจะเห็นว่าของ 128 "อนุญาต" ค่าเพียงประมาณครึ่งหนึ่งเป็นตัวอักษรและตัวเลข 30 วรรคตอนและส่วนที่เหลือเป็นตัวควบคุม กลุ่มหลังไม่ได้ใช้ไฟล์ข้อความบ่อยนักและพวกมันก็ไม่ได้เป็นตัวแทนที่ดีเลย บางคนก็มีแท็บและนิวไลน์ตัวอักษรที่บรรณาธิการข้อความแล้วต้องได้รับความคิดสร้างสรรค์ในการแสดงพวกเขา
โปรแกรมแก้ไขข้อความบางตัวมีตัวเลือกให้แสดงช่องว่างอย่างชัดเจน จากนั้นพวกเขาจะถูกวาดเป็นตัวละครนอกเหนือจากพฤติกรรมการจัดรูปแบบปกติของพวกเขา(ซึ่งเป็นเพียงการตีความตัวละครเหล่านี้)
Pure ASCII ตีความเฉพาะค่า 128 เท่านั้น ไบต์ที่ใช้ในการจัดเก็บข้อมูลนี้มีค่าที่เป็นไปได้ 256 ค่าแต่ละค่าดังนั้นครึ่งหนึ่งของค่าที่เป็นไปได้จะไม่ได้รับอนุญาตใน ASCII สิ่งเหล่านี้ถูกใช้ในชุดอักขระเฉพาะภูมิภาคเช่นละติน 1 แต่ใน ASCII จะไม่ได้กำหนด ไม่มีการแสดงที่เป็นประโยชน์ในตัวแสดงข้อความที่สามารถจัดการ ASCII ได้เท่านั้น
ข้อมูลไบนารีมักไม่ถูกตีความว่าเป็นข้อความ ดังนั้นในไฟล์เหล่านี้จึงพบค่าไบต์ที่เป็นไปได้ทั้งหมด ทุกอย่างอื่นจะสิ้นเปลือง (และนั่นคือเหตุผลที่คุณสามารถบีบอัดข้อความได้ดีมาก) รูปแบบไฟล์ภาพมีความซับซ้อนและโดยปกติคุณไม่ได้ดูเป็นข้อความดังนั้นจึงไม่จำเป็นต้องอ่าน
เนื่องจากไม่มีการตีความข้อมูลทั่วไป (ชุดอักขระ) ที่แมปค่าที่เป็นไปได้ทั้งหมดกับตัวอักษรที่อ่านได้และเนื่องจากมันไม่สมเหตุสมผลนัก
ตัวแก้ไขฐานสิบหกเลือกการแสดงที่แตกต่างกันสำหรับข้อมูล: มันจะแสดงแต่ละไบต์เป็นเลขฐานสิบหกสองหลัก เป็นเพียงการนำเสนอที่แตกต่างกันและเป็นหนึ่งเดียวกับชุดอักขระที่มนุษย์สามารถอ่านได้ง่าย: 256 ไบต์ที่เป็นไปได้ทั้งหมดสามารถแสดงเป็นเลขฐานสิบหกสองหลัก
เนื่องจากมีการแมปข้อมูลไบนารีที่ง่ายไปยังฐานสิบหกและในทางกลับกัน (เลขฐานสอง 4 หลักไปยัง / จากเลขฐานสิบหกหลักหนึ่ง) และฐานสองมีข้อมูลน้อยมากต่อหลักฐานสิบหกจึงเป็นวิธีที่มนุษย์ต้องการอ่านไบนารี เหตุผลที่ชอบการเป็นตัวแทนที่แตกต่างกัน
โปรแกรมแก้ไขข้อความบางตัวอาจมีโหมดตัวแก้ไขฐานสิบหกและฮิวริสติกบางส่วนที่พยายามระบุว่าไฟล์เป็นข้อความหรือไบนารีและเลือกโหมดหนึ่งโดยอัตโนมัติหรือโหมดอื่น แต่มันอาจเป็นเรื่องยากที่จะทำให้ถูกต้องและไม่ใช่คุณสมบัติเฉพาะของไฟล์ที่ระบุว่าเป็นประเภทใดชนิดหนึ่ง
บาง FTP ลูกค้าขอให้คุณระบุว่าตอนจบไฟล์ที่ใช้สำหรับข้อมูลที่เป็นข้อความ โปรแกรมเหล่านี้จะเปลี่ยนเนื้อหาไฟล์ให้ตรงกับระบบปฏิบัติการของเครื่องที่คุณเชื่อมต่อเนื่องจาก Windows ใช้ลำดับอักขระที่ลงท้ายด้วยบรรทัดที่แตกต่างกัน ( CR/LF
) มากกว่า Linux และ Unix (รวมถึง Mac OS X; LF
)
เพราะคุณได้เปิดไว้ในข้อความที่แก้ไขไม่ได้เป็นไบนารีบรรณาธิการ
ทุกอย่างเกี่ยวข้องกับบริบทและการตีความ สิ่งที่อยู่ในคอมพิวเตอร์ของคุณคือรูปแบบของแรงดันไฟฟ้าสูงและต่ำหรือภูมิภาคแม่เหล็กของดิสก์ที่ได้รับความหมายเฉพาะเมื่อเราตัดสินใจว่าเราต้องการตีความอย่างไร
ภายใต้สถานการณ์ที่แตกต่างกันรูปแบบ low-high-low-low-low-low-low อาจหมายถึงหมายเลข 65 ตัวพิมพ์ใหญ่ 'A' ซึ่งเป็นสีฟ้าที่ลูกค้าสั่งกาแฟวันที่ 'มีนาคม 6th 'หรืออะไรก็ได้เลยจริงๆ
เมื่อคุณเปิดไฟล์ภาพของคุณในโปรแกรมกราฟิกมันจะรู้ว่าตีความมันเป็นภาพรู้ว่ารูปแบบใดที่บ่งบอกถึงรูปแบบภาพซึ่งรูปแบบใดที่บ่งบอกถึงขนาดของรูปภาพและอื่น ๆ
เมื่อคุณเปิดไฟล์ภาพของคุณในโปรแกรมแก้ไขข้อความไฟล์นั้นจะได้รับการปฏิบัติเหมือนเป็นข้อความ นี่เป็นรูปแบบที่ง่ายมากใกล้กับสิ่งที่เกิดขึ้นจริงในคอมพิวเตอร์ แต่ก็ยังมีการตีความเกิดขึ้น โดยเฉพาะอย่างยิ่งเกือบทุกรูปแบบได้รับการตีความว่าเป็นตัวละครเฉพาะบางอย่างปกติเช่น AZ แต่ยังมีตัวละครแปลก ๆ รูปแบบบางอย่างไม่แสดงเป็นอักขระ แต่จะถือเป็นการจัดรูปแบบพื้นฐาน: ขึ้นบรรทัดใหม่แท็บ
(สถานการณ์มีความซับซ้อนเล็กน้อยโดยสิ่งต่าง ๆ เช่น Unicode และการเข้ารหัสข้อความเช่น UTF-8 แต่ฉันจะไม่จัดการกับสิ่งเหล่านี้ที่นี่เพื่อความเรียบง่าย)
เมื่อคุณเปิดไฟล์ไบนารีในโปรแกรมแก้ไขข้อความโปรดระวังอย่าเปลี่ยนแปลงเนื่องจากการเปลี่ยนแปลงใด ๆ ที่คุณทำจะส่งผลกระทบต่อการตีความปกติของเนื้อหาไฟล์นั่นคือมันจะทำลายไฟล์และทำให้มันใช้ไม่ได้
เป็นตัวอย่างที่ง่ายพิจารณาไฟล์รูปภาพที่เปิดด้วยโปรแกรมแก้ไขข้อความ
ภาพนี้เป็นรูปแบบหมากรุกอย่างง่ายโดยมีความกว้าง 3 พิกเซลและสี่เหลี่ยมสีเทา 1 พิกเซลระหว่างแต่ละตาราง - สามพิกเซลสีดำ, พิกเซลขอบสีเทา, พิกเซลสีขาวสามพิกเซล, พิกเซลขอบสีเทา, ทำซ้ำ
บรรทัดแรกในภาพนั้นจะมีค่าต่อไปนี้สี่ครั้ง:
Black Black Black Gray White White White Gray
0x000000 0x000000 0x000000 0x7F7F7F 0xFFFFFF 0xFFFFFF 0xFFFFFF 0c7F7F7F
(ใน Hex แทนที่จะเป็นไบนารี - สตริงใน Binary จะยาวสี่เท่า - 0x7F จะถูกแทนที่ด้วย 0b01111111)
หากคุณโหลดสตริงของข้อมูลนั้นในเท็กซ์เอดิเตอร์คุณจะได้รับข้อความต่อไปนี้:
[Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Del] [Del] [Del] [Blank] [Blank] [Blank] [Blank] [เปล่า ] [Blank] [Blank] [Blank] [Blank] [Del] [Del] [Del]
นี่เป็นเพราะ 0x00 เป็นรหัส ASCII สำหรับค่า Null และคุณต้องเขียน 3 ครั้งเพื่อรับค่าพิกเซลสีดำ (ใน 24 บิต BMP ต่อไป) และคุณมี 3 พิกเซลสีดำ จากนั้น 0x7F เป็นรหัส ASCII สำหรับลบและคุณต้องใช้สามครั้งเพื่อรับพิกเซลสีเทา 0xFF ไม่ใช่รหัส ASCII สำหรับทุกสิ่งโดยเฉพาะแม้แต่ในชุด ASCII แบบขยาย - และคุณต้องเขียนมัน 9 ครั้งเพื่อให้ได้ 3 พิกเซลสีขาว คุณจะได้รับการลบอีกสามครั้งเพื่อเขียนพิกเซลสีเทา
วิธีที่แตกต่างในการแสดงซึ่งอาจอธิบายได้อย่างมีประโยชน์มากกว่าเป็นตัวอย่างย้อนกลับ - คุณต้องเขียนอะไรลงไฟล์เพื่อให้ได้ศูนย์และวัตถุเมื่อเปิดในโปรแกรมแก้ไขข้อความ
รหัส ASCII สำหรับศูนย์และหนึ่งแน่นอน! ศูนย์ในตัวแก้ไขข้อความจะไม่ถูกจัดเก็บเป็นบิตเดียวที่มีค่า 0 แต่จะถูกเก็บไว้เป็น 8 บิตที่มีค่า 0b00110000 หรือใน hex 0x30
รหัส ASCII สำหรับ '0' คือ 0x30 และรหัส ASCII สำหรับ '1' คือ 0x31 ดังนั้นหากคุณต้องการจัดเก็บรูปแบบหมากรุกเป็นเลขศูนย์และเลขที่ไฟล์ของคุณจะมีลักษณะดังนี้:
text editor:
10101010
01010101
10101010
01010101
Stored data (ASCII values for '1', '0' and 'new line'):
0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x0D 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x0D 0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x0D 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x31
มีมากไปกว่านี้ - ไฟล์มีการเริ่มต้นและหยุดและเมตาดาต้าและทุกชนิดอื่น ๆ แต่บทเรียน takehome และคำตอบสำหรับคำถามของคุณคือ:
เว้นแต่ว่า 8 บิตแรกของไฟล์ของคุณคือ 0b00110000 ตัวแก้ไขข้อความของคุณจะไม่เขียน '0' เพราะนั่นคือรหัส ASCII สำหรับอักขระ '0' นอกจาก 8 บิตแรกของไฟล์ของคุณคือ 0b00110001 โปรแกรมแก้ไขข้อความของคุณจะไม่เขียน '1' เพราะนั่นคือรหัส ASCII สำหรับอักขระ '1'
ตัวแก้ไขไม่ฉลาดพอที่จะคิดว่าข้อความบางข้อความมีเหตุผลหรือไม่ดังนั้นจึงแสดงไฟล์ใด ๆ เป็นข้อความยกเว้นว่ามีการบอกเป็นอย่างอื่นโดยเฉพาะหากมีคุณลักษณะนั้น ตามที่คนอื่น ๆ ชี้ให้เห็นบรรณาธิการบางคนมีคุณสมบัติในการแสดงฐานสิบหก