DataView

DataView

DataView 뷰는 플랫폼의 엔디언(endianness)을 신경 쓰지 않고 바이너리 ArrayBuffer에서 여러 숫자 타입을 읽고 쓰기 위한 저수준 인터페이스를 제공한다.

출처: DataView - JavaScript | MDN

본문

개요

DataView는 바이너리 ArrayBuffer의 내용을 숫자 타입별로 읽고 쓰는 저수준 인터페이스이다. typed array와 달리 DataView는 플랫폼의 엔디언에 관계없이 데이터 접근 방식을 명시적으로 제어할 수 있다.

엔디언(Endianness)

멀티바이트 숫자 형식은 머신 아키텍처에 따라 메모리에서 다르게 표현된다. DataView 접근자는 실행 중인 컴퓨터의 엔디언과 무관하게 데이터가 접근되는 방식을 명시적으로 제어한다. 예를 들어 WebAssembly 메모리는 항상 little-endian이므로 멀티바이트 값을 읽고 쓸 때 typed array 대신 DataView를 사용해야 한다. 예시는 WebAssembly.Memory를 참고하라.

const littleEndian = (() => {
  const buffer = new ArrayBuffer(2);
  new DataView(buffer).setInt16(0, 256, true /* littleEndian */);
  // Int16Array uses the platform's endianness.
  return new Int16Array(buffer)[0] === 256;
})();
console.log(littleEndian); // true or false

참고: DataView는 기본적으로 big-endian으로 읽고 쓰지만, 대부분의 플랫폼은 little-endian을 사용한다.

생성자(Constructor)

  • DataView() — 새로운 DataView 객체를 생성한다.

인스턴스 속성(Instance properties)

DataView.prototype에 정의되며 모든 DataView 인스턴스가 공유한다.

  • DataView.prototype.bufferDataView가 참조하는 ArrayBuffer를 반환한다.
  • DataView.prototype.byteLengthDataView의 길이(바이트)를 반환한다.
  • DataView.prototype.byteOffsetArrayBuffer의 시작부터 DataView까지의 오프셋(바이트)을 반환한다.
  • DataView.prototype.constructor — 인스턴스 객체를 생성한 생성자 함수. 초기 값은 DataView 생성자이다.
  • DataView.prototype[Symbol.toStringTag][Symbol.toStringTag] 속성의 초기 값은 문자열 "DataView". Object.prototype.toString()에서 사용된다.

인스턴스 메서드(Instance methods)

DataView는 데이터를 읽는 getter 메서드와 쓰는 setter 메서드를 모두 제공한다. 각 메서드는 지정된 바이트 오프셋에서 원하는 바이트 수를 읽어 해당 숫자 타입으로 해석한다.

읽기(get) 메서드

  • DataView.prototype.getBigInt64() — 지정된 바이트 오프셋에서 시작하는 8바이트를 읽어 64비트 부호 있는 정수로 해석한다.
  • DataView.prototype.getBigUint64() — 지정된 바이트 오프셋에서 시작하는 8바이트를 읽어 64비트 부호 없는 정수로 해석한다.
  • DataView.prototype.getFloat16() — 지정된 바이트 오프셋에서 시작하는 2바이트를 읽어 16비트 부동소수점 숫자로 해석한다.
  • DataView.prototype.getFloat32() — 지정된 바이트 오프셋에서 시작하는 4바이트를 읽어 32비트 부동소수점 숫자로 해석한다.
  • DataView.prototype.getFloat64() — 지정된 바이트 오프셋에서 시작하는 8바이트를 읽어 64비트 부동소수점 숫자로 해석한다.
  • DataView.prototype.getInt16() — 지정된 바이트 오프셋에서 시작하는 2바이트를 읽어 16비트 부호 있는 정수로 해석한다.
  • DataView.prototype.getInt32() — 지정된 바이트 오프셋에서 시작하는 4바이트를 읽어 32비트 부호 있는 정수로 해석한다.
  • DataView.prototype.getInt8() — 지정된 바이트 오프셋의 1바이트를 읽어 8비트 부호 있는 정수로 해석한다.
  • DataView.prototype.getUint16() — 지정된 바이트 오프셋에서 시작하는 2바이트를 읽어 16비트 부호 없는 정수로 해석한다.
  • DataView.prototype.getUint32() — 지정된 바이트 오프셋에서 시작하는 4바이트를 읽어 32비트 부호 없는 정수로 해석한다.
  • DataView.prototype.getUint8() — 지정된 바이트 오프셋의 1바이트를 읽어 8비트 부호 없는 정수로 해석한다.

쓰기(set) 메서드

  • DataView.prototype.setBigInt64() — BigInt를 받아 지정된 바이트 오프셋에서 시작하는 8바이트에 64비트 부호 있는 정수로 저장한다.
  • DataView.prototype.setBigUint64() — BigInt를 받아 지정된 바이트 오프셋에서 시작하는 8바이트에 64비트 부호 없는 정수로 저장한다.
  • DataView.prototype.setFloat16() — 숫자를 받아 지정된 바이트 오프셋에서 시작하는 2바이트에 16비트 float로 저장한다.
  • DataView.prototype.setFloat32() — 숫자를 받아 지정된 바이트 오프셋에서 시작하는 4바이트에 32비트 float로 저장한다.
  • DataView.prototype.setFloat64() — 숫자를 받아 지정된 바이트 오프셋에서 시작하는 8바이트에 64비트 float로 저장한다.
  • DataView.prototype.setInt16() — 숫자를 받아 지정된 바이트 오프셋의 2바이트에 16비트 부호 있는 정수로 저장한다.
  • DataView.prototype.setInt32() — 숫자를 받아 지정된 바이트 오프셋의 4바이트에 32비트 부호 있는 정수로 저장한다.
  • DataView.prototype.setInt8() — 숫자를 받아 지정된 바이트 오프셋의 1바이트에 8비트 부호 있는 정수로 저장한다.
  • DataView.prototype.setUint16() — 숫자를 받아 지정된 바이트 오프셋의 2바이트에 16비트 부호 없는 정수로 저장한다.
  • DataView.prototype.setUint32() — 숫자를 받아 지정된 바이트 오프셋의 4바이트에 32비트 부호 없는 정수로 저장한다.
  • DataView.prototype.setUint8() — 숫자를 받아 지정된 바이트 오프셋의 1바이트에 8비트 부호 없는 정수로 저장한다.

예제

DataView 사용하기

const buffer = new ArrayBuffer(16);
const view = new DataView(buffer, 0);

view.setInt16(1, 42);
view.getInt16(1); // 42

명세(Specifications)

  • ECMAScript® 2027 Language Specification — sec-dataview-objects

브라우저 호환성

baseline 기준 2015년 7월부터 널리 사용 가능하다. 호환성 표는 JavaScript를 활성화해야 볼 수 있다.

참고 자료

  • DataViewcore-js 폴리필
  • ArrayBuffer
  • SharedArrayBuffer

더 알아보기