Wiki_JS_DataView - inoueshinichi/Wiki_Web GitHub Wiki
- ArrayBuffer(バイナリ配列)をプラットフォームのエンディアンに関係なくR/Wするインスタンス
// JS
const littleEndian = (() => {
let buffer = new ArrayBuffer(2);
new DataView(buffer).setInt16(0, 255, /*リトルエンディアン*/true);
return new Int16Array(buffer)[0] == 256; // bool
})();
console.log(littleEndian); // true or false
一部のブラウザでは, 下記メソッドに未対応
- DataView.prototype.setBigInt64()
- DataView.prototype.setBigUint64()
// JS
function getUint64(dataView, byteOffset, littleEndian) {
// CPUのレジスタ内部: <小> [下位32bit] [上位32bit] <大>
// 1バイト毎にマッピングされる
// リトルエンディアン系 (Intel)
// [data(64bit)] => <(小)アドレス> [上位32bit] [下位32bit] <(大)アドレス>
// ビックエンディアン系 (コードデータと同じ)
// [data(64bit)] => <(小)アドレス> [下位32bit] [上位32bit] <(大)アドレス>
// リトルエンディアン(Intel系)想定で, 64bit数を32bit(4byte)に分割する.
const left = dataView.getUint32(byteOffset, littleEndian); // 下位32bit if littleEndian=true
const right = dataView.getUint32(byteOffset + 4, littleEndian); // 上位32bit if littleEndian=true
// 2つの32bitを結合する
const combined = littleEndian ? left + 2 ** 32 * right : 2**32 * left + right;
if (!Number.isSafeInteger(combined)) {
console.warn(combined, "exceeds MAX_SAFE_INTERGER. Precision may be lost");
}
return combined;
}
- DataView()
ArrayBuffer
byteOffset = 1 bytes
↓
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| * | * | * | byteLength = 3
DataView
- DataView.prototype.buffer : ArrayBufferを返す (readonly)
- DataView.prototype.byteLength (readonly)
- DataView.prototype.byteOffset (readonly)
- DataView.prototype.getInt8(offset) : オフセット位置にある符号付き8bit整数(byte)を取得
- ゲッター
- DataView.prototype.getUint8(offset) : unsigned byte
- DataView.prototype.getInt16(offset) : short
- DataView.prototype.getInt32(offset) : int
- DataView.prototype.getUint32(offset) : unsigned int
- DataView.prototype.getFloat32(offset) : float
- DataView.prototype.getFloat64(offset) : double
- DataView.prototype.getBigInt64(offset) : long long
- DataView.prototype.getBitUint64(offset) : unsigned long long
- セッターも同様にある