DataView

DataView ビューは ArrayBuffer の多様な数値型を、プラットフォームのエンディアンに関係なく読み書きするための低水準インターフェイスを提供します。

解説

エンディアン

多バイトの数値形式は、マシンアーキテクチャによってメモリー内での表現が異なります。説明はエンディアンを参照してください。 DataView のアクセサーは、プラットフォームアーキテクチャのエンディアンに関係なくデータにアクセスする方法を明確に制御する手段を提供します。

var littleEndian = (function() {
  var buffer = new ArrayBuffer(2);
  new DataView(buffer).setInt16(0, 256, true /* リトルエンディアン */);
  // Int16Array はプラットフォームのエンディアンを使用する
  return new Int16Array(buffer)[0] === 256;
})();
console.log(littleEndian); // true または false

64 ビット整数値

一部のブラウザーは DataView.prototype.setBigInt64() および DataView.prototype.setBigUint64() に対応していません。そのため、各ブラウザーで動作するコードで 64 ビット操作ができるようにするには、独自の getUint64() 関数を実装し、 Number.MAX_SAFE_INTEGER までの制度の値を受け取れるようにします。これで十分な場合もあるでしょう。

function getUint64(dataview, byteOffset, littleEndian) {
  // 64 ビット数を 2 つの 32 ビット (4 バイト) の部分に分割する
  const left =  dataview.getUint32(byteOffset, littleEndian);
  const right = dataview.getUint32(byteOffset+4, littleEndian);

  // 2 つの 32 ビットの値を結合する
  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;
}

他にも、完全な 64 ビットの幅が必要な場合、BigInt を作成することもできます。さらに言えば、ネイティブの BigInt はユーザーランドライブラリーの同等品よりもはるかに速いのですが、JavaScript では BigInt は可変長であるという性質上、常に 32 ビット整数よりもはるかに遅くなります。

const BigInt = window.BigInt, bigThirtyTwo = BigInt(32), bigZero = BigInt(0);
function getUint64BigInt(dataview, byteOffset, littleEndian) {
  // 64 ビット数を 2 つの 32 ビット (4 バイト) の部分に分割する
  const left = BigInt(dataview.getUint32(byteOffset|0, !!littleEndian)>>>0);
  const right = BigInt(dataview.getUint32((byteOffset|0) + 4|0, !!littleEndian)>>>0);

  // 2 つの 32 ビットの値を結合して返す
  return littleEndian ? (right<<bigThirtyTwo)|left : (left<<bigThirtyTwo)|right;
}

コンストラクター

DataView()

新しい DataView オブジェクトを作成します。

インスタンスプロパティ

DataView.prototype.buffer

このビューによって参照される ArrayBuffer。構築時に設定されるため、読み取り専用です。

DataView.prototype.byteLength

ArrayBuffer の開始位置からこのビューの (バイト単位の) 長さ。構築時に設定されるため、読み取り専用です。

DataView.prototype.byteOffset

ArrayBuffer の開始位置からこのビューの (バイト単位の) オフセット。構築時に設定されるため、読み取り専用です。

インスタンスメソッド

DataView.prototype.getInt8()

ビューの開始位置から指定されたバイト単位のオフセット位置にある符号付き 8 ビット整数値 (byte) を取得します。

DataView.prototype.getUint8()

ビューの開始位置から指定されたバイト単位のオフセット位置にある符号無し 8 ビット整数値 (unsigned byte) を取得します。

DataView.prototype.getInt16()

ビューの開始位置から指定されたバイト単位のオフセット位置にある符号付き 16 ビット整数値 (short) を取得します。

DataView.prototype.getUint16()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号無し 16 ビット整数値 (unsigned short) を取得します。

DataView.prototype.getInt32()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号あり 32 ビット整数値 (long) を取得します。

DataView.prototype.getUint32()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号無し 32 ビット整数値 (unsigned long) を取得します。

DataView.prototype.getFloat32()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号あり 32 ビット浮動小数点数 (float) を取得します。

DataView.prototype.getFloat64()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号あり 64 ビット浮動小数点数 (double) を取得します。

DataView.prototype.getBigInt64()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号あり 64 ビット整数値(long long) を取得します。

DataView.prototype.getBigUint64()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号なし 64 ビット整数値 (unsigned long long) を取得します。

DataView.prototype.setInt8()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号あり 8 ビット整数値 (byte) を格納します。

DataView.prototype.setUint8()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号なし 8 ビット整数値 (unsigned byte) を格納します。

DataView.prototype.setInt16()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号あり 16 ビット整数値 (short) を格納します。

DataView.prototype.setUint16()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号無し 16 ビット整数値 (unsigned short) を格納します。

DataView.prototype.setInt32()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号あり 32 ビット整数値 (long) を格納します。

DataView.prototype.setUint32()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号無し 32 ビット整数値 (unsigned long) を格納します。

DataView.prototype.setFloat32()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号あり 32 ビット浮動小数点数 (float) を格納します。

DataView.prototype.setFloat64()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号あり 64 ビット浮動小数点数 (double) を格納します。

DataView.prototype.setBigInt64()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号あり 64 ビット整数値 (long long) を格納します。

DataView.prototype.setBigUint64()

ビューの開始位置からの指定されたバイト単位のオフセット位置にある符号なし 64 ビット整数値 (unsigned long long) を格納します。

DataView を使用する

var buffer = new ArrayBuffer(16);
var view = new DataView(buffer, 0);

view.setInt16(1, 42);
view.getInt16(1); // 42

仕様書

Specification
ECMAScript Language Specification (ECMAScript)
# sec-dataview-objects

ブラウザーの互換性

BCD tables only load in the browser

関連情報

  • DataView のポリフィルは core-js で利用できます
  • jDataView: DataView API をすべてのブラウザーや Node.js に展開するポリフィルの JavaScript ライブラリー
  • ArrayBuffer
  • SharedArrayBuffer