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-endian | Least 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