The DataView
view provides a low-level interface for reading and writing multiple number types in a binary ArrayBuffer
, without having to care about the platform's endianness.
DataView
Description
Endianness
Multi-byte number formats are represented in memory differently depending on machine architecture — see Endianness for an explanation. DataView
accessors provide explicit control of how data is accessed, regardless of the executing computer's endianness.
var littleEndian = (function() { var 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
64-bit Integer Values
Some browsers don't have support for DataView.prototype.setBigInt64()
and DataView.prototype.setBigUint64()
. So to enable 64-bit operations in your code that will work across browsers, you could implement your own getUint64()
function, to obtain values with precision up to Number.MAX_SAFE_INTEGER
— which could suffice for certain cases.
function getUint64(dataview, byteOffset, littleEndian) { // split 64-bit number into two 32-bit (4-byte) parts const left = dataview.getUint32(byteOffset, littleEndian); const right = dataview.getUint32(byteOffset+4, littleEndian); // combine the two 32-bit values const combined = littleEndian? left + 2**32*right : 2**32*left + right; if (!Number.isSafeInteger(combined)) console.warn(combined, 'exceeds MAX_SAFE_INTEGER. Precision may be lost'); return combined; }
Alternatively, if you need full 64-bit range, you can create a BigInt
. Further, although native BigInts are much faster than user-land library equivalents, BigInts will always be much slower than 32-bit integers in JavaScript due to the nature of their variable size.
const BigInt = window.BigInt, bigThirtyTwo = BigInt(32), bigZero = BigInt(0); function getUint64BigInt(dataview, byteOffset, littleEndian) { // split 64-bit number into two 32-bit (4-byte) parts const left = BigInt(dataview.getUint32(byteOffset|0, !!littleEndian)>>>0); const right = BigInt(dataview.getUint32((byteOffset|0) + 4|0, !!littleEndian)>>>0); // combine the two 32-bit values and return return littleEndian ? (right<<bigThirtyTwo)|left : (left<<bigThirtyTwo)|right; }
Constructor
-
DataView()
-
Creates a new
DataView
object.
Instance properties
-
DataView.prototype.buffer
-
The
ArrayBuffer
referenced by this view. Fixed at construction time and thus read only. -
DataView.prototype.byteLength
-
The length (in bytes) of this view from the start of its
ArrayBuffer
. Fixed at construction time and thus read only. -
DataView.prototype.byteOffset
-
The offset (in bytes) of this view from the start of its
ArrayBuffer
. Fixed at construction time and thus read only.
Instance methods
-
DataView.prototype.getInt8()
-
Gets a signed 8-bit integer (byte) at the specified byte offset from the start of the view.
-
DataView.prototype.getUint8()
-
Gets an unsigned 8-bit integer (unsigned byte) at the specified byte offset from the start of the view.
-
DataView.prototype.getInt16()
-
Gets a signed 16-bit integer (short) at the specified byte offset from the start of the view.
-
DataView.prototype.getUint16()
-
Gets an unsigned 16-bit integer (unsigned short) at the specified byte offset from the start of the view.
-
DataView.prototype.getInt32()
-
Gets a signed 32-bit integer (long) at the specified byte offset from the start of the view.
-
DataView.prototype.getUint32()
-
Gets an unsigned 32-bit integer (unsigned long) at the specified byte offset from the start of the view.
-
DataView.prototype.getFloat32()
-
Gets a signed 32-bit float (float) at the specified byte offset from the start of the view.
-
DataView.prototype.getFloat64()
-
Gets a signed 64-bit float (double) at the specified byte offset from the start of the view.
-
DataView.prototype.getBigInt64()
-
Gets a signed 64-bit integer (long long) at the specified byte offset from the start of the view.
-
DataView.prototype.getBigUint64()
-
Gets an unsigned 64-bit integer (unsigned long long) at the specified byte offset from the start of the view.
-
DataView.prototype.setInt8()
-
Stores a signed 8-bit integer (byte) value at the specified byte offset from the start of the view.
-
DataView.prototype.setUint8()
-
Stores an unsigned 8-bit integer (unsigned byte) value at the specified byte offset from the start of the view.
-
DataView.prototype.setInt16()
-
Stores a signed 16-bit integer (short) value at the specified byte offset from the start of the view.
-
DataView.prototype.setUint16()
-
Stores an unsigned 16-bit integer (unsigned short) value at the specified byte offset from the start of the view.
-
DataView.prototype.setInt32()
-
Stores a signed 32-bit integer (long) value at the specified byte offset from the start of the view.
-
DataView.prototype.setUint32()
-
Stores an unsigned 32-bit integer (unsigned long) value at the specified byte offset from the start of the view.
-
DataView.prototype.setFloat32()
-
Stores a signed 32-bit float (float) value at the specified byte offset from the start of the view.
-
DataView.prototype.setFloat64()
-
Stores a signed 64-bit float (double) value at the specified byte offset from the start of the view.
-
DataView.prototype.setBigInt64()
-
Stores a signed 64-bit integer (long long) value at the specified byte offset from the start of the view.
-
DataView.prototype.setBigUint64()
-
Stores an unsigned 64-bit integer (unsigned long long) value at the specified byte offset from the start of the view.
Examples
Using DataView
var buffer = new ArrayBuffer(16); var view = new DataView(buffer, 0); view.setInt16(1, 42); view.getInt16(1); // 42
Specifications
Specification |
---|
ECMAScript Language Specification # sec-dataview-objects |
Browser compatibility
Desktop | Mobile | Server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox for Android | Opera Android | Safari on IOS | Samsung Internet | Deno | Node.js | |
DataView |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
DataView |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
buffer |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
byteLength |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
byteOffset |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
getBigInt64 |
67
|
79
|
68
|
No
|
54
|
15
|
67
|
67
|
68
|
48
|
15
|
9.0
|
1.0
|
10.4.0
|
getBigUint64 |
67
|
79
|
68
|
No
|
54
|
15
|
67
|
67
|
68
|
48
|
15
|
9.0
|
1.0
|
10.4.0
|
getFloat32 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
getFloat64 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
getInt16 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
getInt32 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
getInt8 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
getUint16 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
getUint32 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
getUint8 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
setBigInt64 |
67
|
79
|
68
|
No
|
54
|
15
|
67
|
67
|
68
|
48
|
15
|
9.0
|
1.0
|
10.4.0
|
setBigUint64 |
67
|
79
|
68
|
No
|
54
|
15
|
67
|
67
|
68
|
48
|
15
|
9.0
|
1.0
|
10.4.0
|
setFloat32 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
setFloat64 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
setInt16 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
setInt32 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
setInt8 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
setUint16 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
setUint32 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
setUint8 |
9
|
12
|
15
|
10
|
12.1
|
5.1
|
4
|
18
|
15
|
12.1
|
5
|
1.0
|
1.0
|
0.10.0
|
See also
- Polyfill of
DataView
incore-js
- jDataView: JavaScript library that polyfills and extends the
DataView
API to all browsers and Node.js. ArrayBuffer
SharedArrayBuffer
© 2005–2022 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView