DataView
DataView
DataView 뷰는 플랫폼의 엔디언(endianness)을 신경 쓰지 않고 바이너리 ArrayBuffer에서 여러 숫자 타입을 읽고 쓰기 위한 저수준 인터페이스를 제공한다.
본문
개요
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.buffer—DataView가 참조하는ArrayBuffer를 반환한다.DataView.prototype.byteLength—DataView의 길이(바이트)를 반환한다.DataView.prototype.byteOffset—ArrayBuffer의 시작부터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를 활성화해야 볼 수 있다.
참고 자료
DataView의core-js폴리필ArrayBufferSharedArrayBuffer