DataView - JavaScript 编辑
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.
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
Because JavaScript does not currently include standard support for 64-bit integer values, DataView
does not offer native 64-bit operations. As a workaround, you could implement your own getUint64()
function to obtain a value 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 (ECMA-262) The definition of 'DataView' in that specification. |
Browser compatibility
BCD tables only load in the browser
See also
- jDataView: JavaScript library that polyfills and extends the
DataView
API to all browsers and Node.js. ArrayBuffer
SharedArrayBuffer
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论