Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Phương thức DataView.setUint32() trong JavaScript

DataView.setUint32() ghi một số nguyên 32-bit không dấu (0 đến 4,294,967,295) vào buffer tại vị trí byte chỉ định, với hỗ trợ endianness.

Cú pháp

dataView.setUint32(byteOffset, value [, littleEndian])
  • byteOffset: Vị trí byte bắt đầu ghi
  • value: Giá trị cần ghi (0 - 4,294,967,295)
  • littleEndian: Tùy chọn, true = little-endian, mặc định false
  • Trả về: undefined

Ví dụ cơ bản

const buffer = new ArrayBuffer(20);
const view = new DataView(buffer);

view.setUint32(1, 45544);
console.log(view.getUint32(1)); // 45544

Xử lý giá trị float

const buffer = new ArrayBuffer(20);
const view = new DataView(buffer);

view.setUint32(1, 455.44); // Phần thập phân bị cắt
console.log(view.getUint32(1)); // 455

Tràn số (Overflow)

const buffer = new ArrayBuffer(20);
const view = new DataView(buffer);

view.setUint32(0, 4294967295); // Max uint32
console.log(view.getUint32(0)); // 4294967295

view.setUint32(0, 4294967296); // 2^32 -> tràn về 0
console.log(view.getUint32(0)); // 0

view.setUint32(0, -1); // Âm -> bù 2: 4294967295
console.log(view.getUint32(0)); // 4294967295

Đọc vị trí chưa ghi

const buffer = new ArrayBuffer(20);
const view = new DataView(buffer);

view.setUint32(1); // Ghi 0
console.log(view.getUint32(1)); // 0

Endianness

const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
const value = 0x12345678;

view.setUint32(0, value, false); // Big-endian
view.setUint32(4, value, true);  // Little-endian

// Bộ nhớ: [0x12,0x34,0x56,0x78, 0x78,0x56,0x34,0x12]
console.log(new Uint8Array(buffer)); // Uint8Array(8) [18, 52, 86, 120, 120, 86, 52, 18]

Ứng dụng

  • Ghi header file: kích thước file (PNG, ZIP, MP4)
  • Protocol mạng: sequence number, timestamp, checksum
  • ID lớn, pointer, bitmask 32-bit
  • WebGL: uniform buffer, shader storage buffer

Lưu ý

  • Cần 4 byte từ byteOffset
  • Giá trị float bị truncate (cắt phần thập phân)
  • Giá trị âm chuyển thành bù 2
  • Vượt ranh buffer ném RangeError