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

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

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 ได้แม่นยำทั้งช่วง