--- title: DataView slug: Web/JavaScript/Reference/Global_Objects/DataView tags: - Class - DataView - JavaScript - TypedArrays translation_of: Web/JavaScript/Reference/Global_Objects/DataView ---
{{JSRef}}

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

説明

エンディアン

多バイトの数値形式は、マシンアーキテクチャによってメモリー内での表現が異なります。これは {{Glossary("Endianness", "エンディアン")}}で説明しています。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() 関数を実装して {{jsxref("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 ビットの幅が必要な場合、{{jsxref("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 オブジェクトを作成します。

インスタンスプロパティ

{{jsxref("DataView.prototype.buffer")}}
このビューによって参照される {{jsxref("ArrayBuffer")}} 。構築時に設定されるため、読取専用です。
{{jsxref("DataView.prototype.byteLength")}}
{{jsxref("ArrayBuffer")}} の開始位置からこのビューの(バイト単位の)長さ。構築時に設定されるため、読取専用です。
{{jsxref("DataView.prototype.byteOffset")}}
{{jsxref("ArrayBuffer")}} の開始位置からこのビューの(バイト単位の)オフセット。構築時に設定されるため、読取専用です。

インスタンスメソッド

{{jsxref("DataView.prototype.getInt8()")}}
ビューの開始位置から指定されたバイト単位のオフセットで符号付き 8 ビット整数値(byte)を取得します。
{{jsxref("DataView.prototype.getUint8()")}}
ビューの開始位置から指定されたバイト単位のオフセットで符号無し 8 ビット整数値(unsigned byte) を取得します。
{{jsxref("DataView.prototype.getInt16()")}}
ビューの開始位置から指定されたバイト単位のオフセットで符号付き 16 ビット整数値(short)を取得します。
{{jsxref("DataView.prototype.getUint16()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号無し 16 ビット整数値(unsigned short)を取得します。
{{jsxref("DataView.prototype.getInt32()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号あり 32 ビット整数値(long)を取得します。
{{jsxref("DataView.prototype.getUint32()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号無し 32 ビット整数値(unsigned long)を取得します。
{{jsxref("DataView.prototype.getFloat32()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号あり 32 ビット浮動小数点数(float)を取得します。
{{jsxref("DataView.prototype.getFloat64()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号あり 64 ビット浮動小数点数(double)を取得します。
{{jsxref("DataView.prototype.getBigInt64()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号あり 64 ビット整数値(long long)を取得します。
{{jsxref("DataView.prototype.getBigUint64()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号なし 64 ビット整数値(unsigned long long)を取得します。
{{jsxref("DataView.prototype.setInt8()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号あり 8 ビット整数値(byte)を格納します。
{{jsxref("DataView.prototype.setUint8()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号なし 8 ビット整数値(unsigned byte)を格納します。
{{jsxref("DataView.prototype.setInt16()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号あり 16 ビット整数値(short)を格納します。
{{jsxref("DataView.prototype.setUint16()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号無し 16 ビット整数値(unsigned short)を格納します。
{{jsxref("DataView.prototype.setInt32()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号あり 32 ビット整数値(long)を格納します。
{{jsxref("DataView.prototype.setUint32()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号無し 32 ビット整数値(unsigned long)を格納します。
{{jsxref("DataView.prototype.setFloat32()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号あり 32 ビット浮動小数点数(float)を格納します。
{{jsxref("DataView.prototype.setFloat64()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号あり 64 ビット浮動小数点数(double)を格納します。
{{jsxref("DataView.prototype.setBigInt64()")}}
ビューの開始位置からの指定されたバイト単位のオフセットで符号あり 64 ビット整数値(long long)を格納します。
{{jsxref("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

仕様書

仕様書
{{SpecName('ESDraft', '#sec-dataview-objects', 'DataView')}}

ブラウザーの互換性

{{Compat("javascript.builtins.DataView")}}

関連情報