aboutsummaryrefslogtreecommitdiff
path: root/files/ja/web/javascript/reference/global_objects/dataview/index.html
blob: 0e7ea6defdf2faf58cc26ec40097d83753fb0f75 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
---
title: DataView
slug: Web/JavaScript/Reference/Global_Objects/DataView
tags:
  - Class
  - DataView
  - JavaScript
  - TypedArrays
translation_of: Web/JavaScript/Reference/Global_Objects/DataView
---
<div>{{JSRef}}</div>

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

<h2 id="Description" name="Description">説明</h2>

<h3 id="Endianness" name="Endianness">エンディアン</h3>

<p>多バイトの数値形式は、マシンアーキテクチャによってメモリー内での表現が異なります。これは {{Glossary("Endianness", "エンディアン")}}で説明しています。DataView のアクセサーは、プラットフォームアーキテクチャのエンディアンに関係なくデータにアクセスする方法を明確に制御する手段を提供します。</p>

<pre class="brush: js notranslate">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
</pre>

<h3 id="64-bit_Integer_Values" name="64-bit_Integer_Values">64 ビット整数値</h3>

<p>JavaScript は現在のところ、64 ビット整数値に標準で対応していないので、<code>DataView</code> はネイティブの 64 ビット操作を提供していません。回避策として、独自で <code>getUint64()</code> 関数を実装して {{jsxref("Number.MAX_SAFE_INTEGER")}} までの制度の値を受け取れるようにします。</p>

<pre class="brush: js notranslate">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;
}
</pre>

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

<pre class="brush: js notranslate">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)&gt;&gt;&gt;0);
  const right = BigInt(dataview.getUint32((byteOffset|0) + 4|0, !!littleEndian)&gt;&gt;&gt;0);

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

<h2 id="Constructor" name="Constructor">コンストラクタ</h2>

<dl>
 <dt><a href="/ja/docs/Web/JavaScript/Reference/Global_Objects/DataView/DataView"><code>DataView()</code></a></dt>
 <dd>新しい <code>DataView</code> オブジェクトを作成します。</dd>
</dl>

<h2 id="Instance_properties" name="Instance_properties">インスタンスプロパティ</h2>

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

<h2 id="Instance_methods" name="Instance_methods">インスタンスメソッド</h2>

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

<h2 id="Example" name="Example"></h2>

<h3 id="Using_DataView" name="Using_DataView">DataView を使用する</h3>

<pre class="brush: js notranslate">var buffer = new ArrayBuffer(16);
var view = new DataView(buffer, 0);

view.setInt16(1, 42);
view.getInt16(1); // 42
</pre>

<h2 id="Specifications" name="Specifications">仕様書</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">仕様書</th>
  </tr>
 </thead>
 <tbody>
  <tr>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-dataview-objects', 'DataView')}}</td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility" name="Browser_compatibility">ブラウザーの互換性</h2>

<div class="hidden">このページの互換性一覧表は構造化データから生成されています。データに協力していただけるのであれば、<a class="external" href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> をチェックアウトしてプルリクエストを送信してください。</div>

<p>{{Compat("javascript.builtins.DataView")}}</p>

<h2 id="See_also" name="See_also">関連情報</h2>

<ul>
 <li><a class="link-https" href="https://github.com/jDataView/jDataView">jDataView</a>: <code>DataView</code> API をすべてのブラウザーや Node.js に展開するポリフィルの JavaScript ライブラリー</li>
 <li>{{jsxref("ArrayBuffer")}}</li>
 <li>{{jsxref("SharedArrayBuffer")}}</li>
</ul>