DataView.setInt8() คืออะไร
เมธอด DataView.prototype.setInt8() ใช้สำหรับ เขียนค่าจำนวนเต็มมีเครื่องหมาย 8-bit (signed 8-bit integer) ลงในตำแหน่งที่กำหนดใน DataView ค่าที่เขียนได้จะอยู่ในช่วง -128 ถึง 127
หมายเหตุ: เอกสารต้นฉบับระบุว่า "signed 8-bit floating point number" ซึ่ง ไม่ถูกต้อง - setInt8() เขียนค่า integer (จำนวนเต็ม) ไม่ใช่ floating point
ไวยากรณ์ (Syntax)
dataView.setInt8(byteOffset, value)
byteOffset- ตำแหน่งในหน่วยไบต์ (0-indexed)value- ค่าที่จะเขียน (-128 ถึง 127)
คืนค่า: undefined
ตัวอย่างการใช้งาน
ตัวอย่างที่ 1: การเขียนและอ่านค่าพื้นฐาน
const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);
view.setInt8(0, 362); // 362 & 0xFF = 106 (0x6A)
console.log(view.getInt8(0)); // 106
ตัวอย่างที่ 2: ค่าลบและ Two's Complement
const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);
view.setInt8(0, -1); // 0xFF (255 unsigned)
view.setInt8(1, -128); // 0x80 (min int8)
view.setInt8(2, 127); // 0x7F (max int8)
view.setInt8(3, -50); // 0xCE (206 unsigned)
console.log(view.getInt8(0)); // -1
console.log(view.getInt8(1)); // -128
console.log(view.getInt8(2)); // 127
console.log(view.getInt8(3)); // -50
// ดู raw bytes
const u8 = new Uint8Array(buffer);
console.log(Array.from(u8)); // [255, 128, 127, 206]
ตัวอย่างที่ 3: การแปลงค่า Float
const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);
view.setInt8(0, 362.23); // truncate -> 362 -> 106
console.log(view.getInt8(0)); // 106
ตัวอย่างที่ 4: อ่านค่าที่ยังไม่ได้ตั้งค่า
const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);
console.log(view.getInt8(0)); // 0
Two's Complement สำหรับ 8-bit
| Decimal | Binary | Hex | Unsigned (Uint8) |
|---|---|---|---|
| 127 | 01111111 | 0x7F | 127 |
| 1 | 00000001 | 0x01 | 1 |
| 0 | 00000000 | 0x00 | 0 |
| -1 | 11111111 | 0xFF | 255 |
| -50 | 11001110 | 0xCE | 206 |
| -128 | 10000000 | 0x80 | 128 |
กรณีการใช้งานทั่วไป
- Protocol parsing: Signed byte fields ใน binary protocols
- Sensor data: Temperature offsets, accelerometer (signed values)
- Audio: 8-bit PCM signed audio samples
- Image processing: Signed differences, delta encoding
- Game development: Compact state flags with negative values
- Cryptography: Byte-level manipulation
ข้อควรระวัง
- โยน
RangeErrorหากbyteOffsetติดลบ หรือbyteOffset >= byteLength - ค่า
valueจะถูกแปลงด้วยToInt8(modulo 256 แล้ว interpret เป็น signed) - ไม่มีพารามิเตอร์ endianness เพราะ 8-bit มีเพียง 1 ไบต์
- JavaScript ไม่มีทีป 8-bit integer แบบ native - DataView ช่วยให้จัดการได้