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 ビット整数値

JavaScript は現在のところ、64 ビット整数値に標準で対応していないので、DataView はネイティブの 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() (en-US)
ビューの開始位置からの指定されたバイト単位のオフセットで符号あり 64 ビット整数値(long long)を取得します。
DataView.prototype.getBigUint64() (en-US)
ビューの開始位置からの指定されたバイト単位のオフセットで符号なし 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() (en-US)
ビューの開始位置からの指定されたバイト単位のオフセットで符号あり 64 ビット整数値(long long)を格納します。
DataView.prototype.setBigUint64() (en-US)
ビューの開始位置からの指定されたバイト単位のオフセットで符号なし 64 ビット整数値(unsigned long long)を格納します。

DataView を使用する

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

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

仕様書

仕様書
ECMAScript (ECMA-262)
DataView の定義

ブラウザーの互換性

BCD tables only load in the browser

関連情報