Wiki_JS_DataView - inoueshinichi/Wiki_Web GitHub Wiki

DataView

  • 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

ブラウザーの64bit整数値への対応

一部のブラウザでは, 下記メソッドに未対応

  • DataView.prototype.setBigInt64()
  • DataView.prototype.setBigUint64()
すべてのブラウザーで動作するコードで64bit操作ができるようにするために 独自の`getUint64()`関数を実装して, Number.MAX_SAFE_INTEGERまでの精度の値を受け取れるようにする.
// 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
  • セッターも同様にある
⚠️ **GitHub.com Fallback** ⚠️