Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

ฟังก์ชัน DataView.getUint16() ใน JavaScript

DataView.getUint16() คืออะไร

เมธอด DataView.prototype.getUint16() ใช้สำหรับ อ่านค่าจำนวนเต็มไม่มีเครื่องหมาย 16-bit (unsigned 16-bit integer) จากตำแหน่งที่กำหนดใน DataView ค่าที่อ่านได้จะอยู่ในช่วง 0 ถึง 65535 (0x0000 - 0xFFFF)

ไวยากรณ์ (Syntax)

dataView.getUint16(byteOffset [, littleEndian])
  • byteOffset - ตำแหน่งเริ่มต้นในหน่วยไบต์ (0-indexed)
  • littleEndian (optional) - true = little-endian, false = big-endian (default: false)

คืนค่า: จำนวนเต็มไม่มีเครื่องหมาย 16-bit (0 - 65535)

ตัวอย่างการใช้งาน

ตัวอย่างที่ 1: การอ่านค่าพื้นฐาน (Big-endian / Network byte order)

const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);

// เขียนค่า 45544 (0xB1F8) ที่ offset 0 แบบ big-endian
view.setUint16(0, 45544);

console.log(view.getUint16(0));       // 45544 (big-endian default)
console.log(view.getUint16(0, false)); // 45544 (big-endian explicit)
console.log(view.getUint16(0, true));  // 63473 (little-endian: 0xF8B1)

ตัวอย่างที่ 2: การจัดการ Endianness

const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);
const value = 0x1234; // 4660 ใน decimal

// เขียนแบบ big-endian: 0x12, 0x34
view.setUint16(0, value, false);

// เขียนแบบ little-endian: 0x34, 0x12
view.setUint16(2, value, true);

console.log('Big-endian:', view.getUint16(0, false).toString(16));   // 1234
console.log('Little-endian:', view.getUint16(2, true).toString(16)); // 1234

// อ่านแบบผิด endian
console.log('Wrong endian:', view.getUint16(0, true).toString(16));  // 3412

ตัวอย่างที่ 3: การแปลงค่า Float เป็น Integer

const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);

// ส่งค่า float เข้า setUint16 - จะถูกแปลงเป็น integer (truncate)
view.setUint16(0, 455.44);
console.log(view.getUint16(0)); // 455 (ส่วนทศนิยมถูกตัดทิ้ง)

ตัวอย่างที่ 4: อ่านค่าที่ยังไม่ได้ตั้งค่า

const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);

// ไม่ได้ setUint16 ไปเลย
console.log(view.getUint16(0)); // 0 (ค่า default ของ ArrayBuffer คือ 0)

Endianness (Byte Order) ความสำคัญ

Endianness กำหนดลำดับไบต์ในหน่วยความจำ:

Endiannessลำดับไบต์ใช้เมื่อไหร่
Big-endian (default)Most significant byte first (MSB first)Network protocols (TCP/IP), File formats (PNG, JPEG)
Little-endianLeast significant byte first (LSB first)x86/x64 CPU, WebAssembly, บาง file formats
// ตัวอย่าง: ค่า 0x1234 (4660)
// Big-endian  ในหน่วยความจำ: [0x12, 0x34]
// Little-endian ในหน่วยความจำ: [0x34, 0x12]

กรณีการใช้งานทั่วไป

  • Network programming: อ่าน header ของ packet (ports, sequence numbers, checksums)
  • File format parsing: BMP, PNG, WAV, TIFF headers
  • Binary protocols: Protocol buffers, MessagePack, custom protocols
  • Hardware communication: อ่านค่าจาก sensor, microcontroller registers

กรณีพิเศษและข้อผิดพลาด

  • โยน RangeError หาก byteOffset ติดลบ หรือ byteOffset + 2 > byteLength
  • ค่า value ใน setUint16 จะถูก modulo 65536 (wrap around)
  • ไม่รองรับการอ่านข้ามขอบเขต buffer