DataView.getInt32() คืออะไร
เมธอด DataView.prototype.getInt32() ใช้สำหรับ อ่านค่าจำนวนเต็มมีเครื่องหมาย 32-bit (signed 32-bit integer) จากตำแหน่งที่กำหนดใน DataView ค่าที่อ่านได้จะอยู่ในช่วง -2,147,483,648 ถึง 2,147,483,647 (-2^31 ถึง 2^31-1)
ไวยากรณ์ (Syntax)
dataView.getInt32(byteOffset [, littleEndian])
byteOffset- ตำแหน่งเริ่มต้นในหน่วยไบต์ (0-indexed)littleEndian(optional) -true= little-endian,false= big-endian (default:false)
คืนค่า: จำนวนเต็มมีเครื่องหมาย 32-bit
ตัวอย่างการใช้งาน
ตัวอย่างที่ 1: การอ่านค่าพื้นฐาน
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
view.setInt32(0, 36274722); // big-endian default
console.log(view.getInt32(0)); // 36274722
console.log(view.getInt32(0, false)); // 36274722 (big-endian)
console.log(view.getInt32(0, true)); // ค่าที่ต่างออกไป (little-endian reading big-endian data)
ตัวอย่างที่ 2: การจัดการ Endianness
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
const value = 0x12345678; // 305419896
// เขียน big-endian
view.setInt32(0, value, false);
// เขียน little-endian
view.setInt32(4, value, true);
console.log('BE read BE:', view.getInt32(0, false).toString(16)); // 12345678
console.log('LE read LE:', view.getInt32(4, true).toString(16)); // 12345678
console.log('BE read LE:', view.getInt32(0, true).toString(16)); // 78563412
console.log('LE read BE:', view.getInt32(4, false).toString(16)); // 78563412
ตัวอย่างที่ 3: ค่าลบและ Overflow
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
view.setInt32(0, -1); // 0xFFFFFFFF
view.setInt32(4, 2147483648); // 0x80000000 (เกิน max int32 จะกลายเป็น -2147483648)
console.log(view.getInt32(0)); // -1
console.log(view.getInt32(4)); // -2147483648 (overflow wrap-around)
ตัวอย่างที่ 4: การแปลงค่า Float
const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);
view.setInt32(0, 554.36); // ตัดทศนิยม -> 554
console.log(view.getInt32(0)); // 554
ตัวอย่างที่ 5: อ่านค่าที่ยังไม่ได้ตั้งค่า
const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);
console.log(view.getInt32(0)); // 0
Endianness และการประยุกต์ใช้
Network Byte Order (Big-Endian)
// มาตรฐานเครือข่าย (TCP/IP, HTTP/2, DNS, etc.)
function readNetworkInt32(view, offset) {
return view.getInt32(offset, false); // false = big-endian
}
Little-Endian (Intel x86, WebAssembly, WASI)
// สำหรับข้อมูลจาก CPU architecture little-endian
function readLEInt32(view, offset) {
return view.getInt32(offset, true); // true = little-endian
}
กรณีการใช้งานทั่วไป
- Network protocols: IPv4 addresses, TCP/UDP ports, sequence numbers, timestamps
- File formats: PNG (chunk lengths), MP4, ZIP, EXE headers
- Database storage: Binary serialization of integers
- Game networking: Entity IDs, timestamps, coordinates
- WebAssembly interop: รับส่งค่า i32 ระหว่าง JS และ WASM
กรณีพิเศษและข้อผิดพลาด
- โยน
RangeErrorหากbyteOffsetติดลบ หรือbyteOffset + 4 > byteLength - ค่าที่เขียนจะถูก modulo 2^32 (wrap around ตาม two's complement)
- JavaScript number เป็น IEEE 754 double precision สามารถแทนค่า int32 ได้แม่นยำทั้งช่วง