วันเสาร์ที่ 12 พฤษภาคม พ.ศ. 2561

Big and Little Endian


สวัสดีครับวันนี้จะแชร์ความรู้เรื่อง Big Endian และ Little Endian ว่าคืออะไรและต่างกันอย่างไร งั้นเริ่มกันเลย

ในการเขียนและอ่านหนังสือของแต่ละประเทศจะมีลำดับการอ่านและเขียนต่างกัน ตัวอย่างเช่น ประเทศไทยเราจะอ่านหนังสือและเขียนหนังสือ จากหน้าซ้ายไปหน้าขวา แต่ประเทศญี่ปุ่นจะอ่านและเขียนหนังสือจากหน้าขวามาหน้าซ้าย

ในการอ่านและจัดเรียง ค่าตัวเลขของแต่ละสถาปัตยกรรมก็เช่นกันก็จะมีการจัดเรียงที่ต่างกัน ซึ่งในการจัดเรียงค่าตัวเลขที่มีขนาดมากกว่า 1 ไบต์ในหน่วยความจำ จะมีรูปแบบการจัดเก็บ 2 รูปแบบหลักๆคือ แบบที่เรียกว่า Big Endian และแบบที่เรียกว่า Little Endian

สมมุติเรามีค่าตัวเลขฐานสิบเป็น 16,532,935

Big endian byte order  จะนำตำแหน่งที่มีความสำคัญสูงสุดหรือมากสุดเก็บก่อน ซึ่งจะแสดงผลลัพธ์ได้ตามตัวอย่างดังนี้

                ค่าตัวเลขฐานสิบเป็น 16,532,935 จะแปลงเป็นเลขฐาน 16 ได้เป็น 0x00fc45c7
จะเห็นว่า byte ที่มีค่า 00 ซึ่งมีความสำคัญสูงสุดจะถูกเก็บก่อน

Little endian byte order  จะนำตำแหน่งที่มีความสำคัญต่ำสุดหรือน้อยสุดเก็บก่อน ซึ่งจะแสดงผลลัพธ์ได้ตามตัวอย่างดังนี้

                ค่าตัวเลขฐานสิบเป็น 16,532,935 จะแปลงเป็นเลขฐาน 16 ได้เป็น 0xc745cf00
จะเห็นว่า byte ที่มีค่า c7 ซึ่งมีความสำคัญตำสุดจะถูกเก็บก่อน

จะเห็นว่าต่างสถาปัตยกรรมกันจะมีรูปแบบการเก็บที่ต่างกันส่งผลให้วิธีการอ่านค่าตัวเลขที่ต่างกันดังนั้นในการส่งข้อมูลระหว่างสถาปัตยกรรมเราต้องคำนึงเรื่อง Little endian และ Big Endian ด้วย

ตัวอย่างเช่น


จะเห็นว่าเครื่อง MAC ซึ่งเป็นรูปแบบสถาปัตยกรรมในการเก็บตัวเลขบน Memory รูปแบบ Little Endian จะส่งตัวเลขค่า 16,532,935 แปลงเป็นเลขฐาน 16 ได้ 0xc745cf00 ส่งให้กับเครื่อง Note book HPที่เป็นค่า 0xc745cf00 จึงทำให้เครื่อง HP อ่านค่าที่ได้ผิดไปจากเครื่อง MAC (คือค่า 16,532,935) เนื่องจากเครื่อง HP มีรูปแบบในการเก็บข้อมูลต่างจากเครื่อง MAC (เครื่อง MAC เก็บแบบ Little Endian เครื่อง HP เก็บแบบ Big Endian) ดังนั้นวิธีแก้คือเราต้องรู้ก่อนว่าแต่ละเครื่องเก็บรูปแบบใดบ้างและต้องจัดเรียงข้อมูลให้อยู่ในรูปแบบแต่ละเครื่องดังภาพด้านล่าง จึงจะทำให้เครื่อง HP อ่านค่าถูกต้องครับ