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

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

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