DataView.getUint8() คืออะไร
เมธอด DataView.prototype.getUint8() ใช้สำหรับ อ่านค่าจำนวนเต็มไม่มีเครื่องหมาย 8-bit (unsigned 8-bit integer) จากตำแหน่งที่กำหนดใน DataView ค่าที่อ่านได้จะอยู่ในช่วง 0 ถึง 255 (0x00 - 0xFF)
นี่คือเมธอดพื้นฐานที่สุดสำหรับการอ่านข้อมูลแบบไบต์เดี่ยว (byte-level access) ใช้สำหรับอ่าน raw bytes, ASCII characters, bit flags, และ binary data ทุกประเภท
ไวยากรณ์ (Syntax)
dataView.getUint8(byteOffset)
byteOffset- ตำแหน่งในหน่วยไบต์ (0-indexed)
คืนค่า: จำนวนเต็มไม่มีเครื่องหมาย 8-bit (0-255)
ตัวอย่างการใช้งาน
ตัวอย่างที่ 1: การอ่านค่าพื้นฐาน
const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);
view.setUint8(0, 657); // 657 & 0xFF = 145 (0x91)
console.log(view.getUint8(0)); // 145
ตัวอย่างที่ 2: การอ่าน ASCII / Text Data
const text = 'Hello';
const buffer = new ArrayBuffer(text.length);
const view = new DataView(buffer);
// เขียน ASCII codes
for (let i = 0; i < text.length; i++) {
view.setUint8(i, text.charCodeAt(i));
}
// อ่านกลับ
let result = '';
for (let i = 0; i < text.length; i++) {
result += String.fromCharCode(view.getUint8(i));
}
console.log(result); // "Hello"
ตัวอย่างที่ 3: การจัดการ Bit Flags
const buffer = new ArrayBuffer(1);
const view = new DataView(buffer);
const FLAGS = {
READ: 0b00000001, // 1
WRITE: 0b00000010, // 2
EXECUTE: 0b00000100, // 4
ADMIN: 0b00001000 // 8
};
// ตั้งค่า flags
view.setUint8(0, FLAGS.READ | FLAGS.WRITE); // 3 (00000011)
// ตรวจสอบ flags
const value = view.getUint8(0);
console.log('Has READ:', (value & FLAGS.READ) !== 0); // true
console.log('Has WRITE:', (value & FLAGS.WRITE) !== 0); // true
console.log('Has EXECUTE:', (value & FLAGS.EXECUTE) !== 0); // false
console.log('Has ADMIN:', (value & FLAGS.ADMIN) !== 0); // false
ตัวอย่างที่ 4: การแปลงค่า Float
const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);
view.setUint8(0, 657.82); // truncate -> 657 -> 145 (657 % 256)
console.log(view.getUint8(0)); // 145
ตัวอย่างที่ 5: อ่านค่าที่ยังไม่ได้ตั้งค่า
const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);
console.log(view.getUint8(0)); // 0
ตัวอย่างที่ 6: Raw Byte Inspection
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
const f64 = new Float64Array(buffer);
f64[0] = 3.14159;
// ดู raw bytes ของ float64 (IEEE 754)
for (let i = 0; i < 8; i++) {
console.log(`Byte ${i}: 0x${view.getUint8(i).toString(16).padStart(2, '0')}`);
}
// Byte 0: 0x40 (sign + exponent high)
// Byte 1: 0x09
// Byte 2: 0x21
// Byte 3: 0xfb
// Byte 4: 0x54
// Byte 5: 0x44
// Byte 6: 0x2d
// Byte 7: 0x18 (mantissa low)
Endianness และ Uint8
ไม่มี endianness สำหรับ 8-bit เพราะมีเพียง 1 ไบต์ - ลำดับไบต์ไม่เกี่ยวข้อง
กรณีการใช้งานทั่วไป
- Binary parsing: อ่านไบต์ต่อไบต์ใน parser
- Text encoding: ASCII, Latin-1, UTF-8 byte-by-byte
- Bit manipulation: Flags, permissions, bitmasks
- Checksums: CRC8, XOR checksums
- Image processing: Pixel values (grayscale, palette indices)
- Cryptography: Byte-level operations
- Protocol implementation: Raw byte streams
กรณีพิเศษและข้อผิดพลาด
- โยน
RangeErrorหากbyteOffsetติดลบ หรือbyteOffset >= byteLength - ค่า
valueในsetUint8จะถูก modulo 256 (wrap around) - คืนค่า 0 สำหรับตำแหน่งที่ยังไม่ได้เขียน (ArrayBuffer ถูก zero-initialized)
- เร็วที่สุดใน DataView methods เพราะไม่มี endianness conversion