From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- .../reference/global_objects/dataview/index.html | 164 +++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 files/ja/web/javascript/reference/global_objects/dataview/index.html (limited to 'files/ja/web/javascript/reference/global_objects/dataview/index.html') diff --git a/files/ja/web/javascript/reference/global_objects/dataview/index.html b/files/ja/web/javascript/reference/global_objects/dataview/index.html new file mode 100644 index 0000000000..0e7ea6defd --- /dev/null +++ b/files/ja/web/javascript/reference/global_objects/dataview/index.html @@ -0,0 +1,164 @@ +--- +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")}}

+ +

関連情報

+ + -- cgit v1.2.3-54-g00ecf