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

Thuộc tính DataView.byteOffset trong JavaScript

Thuộc tính DataView.byteOffset trả về độ dịch (offset) tính bằng byte từ đầu ArrayBuffer gốc đến vị trí bắt đầu của DataView. Đây là thuộc tính chỉ đọc.

Cú pháp

dataView.byteOffset

Ví dụ cơ bản

const buffer = new ArrayBuffer(114);
const view = new DataView(buffer); // Không truyền offset -> 0

console.log(view.byteOffset); // 0
console.log(view.buffer.byteLength); // 114

Ví dụ với offset tùy chỉnh

const buffer = new ArrayBuffer(100);
const view1 = new DataView(buffer, 0);       // Offset 0
const view2 = new DataView(buffer, 20);      // Offset 20
const view3 = new DataView(buffer, 20, 30);  // Offset 20, length 30

console.log(view1.byteOffset); // 0
console.log(view2.byteOffset); // 20
console.log(view3.byteOffset); // 20

Ứng dụng thực tế

1. Tính vị trí tuyệt đối trong buffer

function getAbsoluteOffset(view, relativeOffset) {
  return view.byteOffset + relativeOffset;
}

2. Phân tích cấu trúc dữ liệu lồng nhau

// Cấu trúc: Header (16 bytes) + Payload (dynamic)
const buffer = new ArrayBuffer(100);
const headerView = new DataView(buffer, 0, 16);
const payloadView = new DataView(buffer, 16); // Bắt đầu sau header

console.log("Header offset:", headerView.byteOffset);   // 0
console.log("Payload offset:", payloadView.byteOffset); // 16

3. Validation truy cập

function safeGetInt32(view, offset) {
  const absoluteOffset = view.byteOffset + offset;
  if (absoluteOffset + 4 > view.buffer.byteLength) {
    throw new RangeError("Vượt quá giới hạn buffer");
  }
  return new DataView(view.buffer).getInt32(absoluteOffset);
}

Lưu ý

  • Luôn là bội số của alignment yêu cầu (thường là 1 cho DataView)
  • Không thay đổi được sau khi tạo DataView
  • Kết hợp với byteLength để xác định phạm vi view: [byteOffset, byteOffset + byteLength)