コンテンツにスキップ

JavaScript/DataView

出典: フリー教科書『ウィキブックス(Wikibooks)』

DataView

[編集]

概要

[編集]

DataView は、JavaScript における低レベルのバイナリデータ操作を行うためのオブジェクトです。ArrayBuffer 上のデータに対して、ビッグエンディアンやリトルエンディアンなどの異なるエンディアン形式を指定して、様々なデータ型の読み書きが可能です。これにより、バイナリデータを柔軟に扱うことができます。

ユースケース

[編集]

DataView は、主に以下のような場面で利用されます。

  • バイナリデータの解析
    ネットワーク通信やファイルの読み込みにおいて、バイナリデータを解析するために使用されます。特に、異なるエンディアン形式に対応する際に有用です。
  • カスタムデータフォーマットの操作
    独自のバイナリフォーマットを使用するアプリケーションにおいて、データを適切にエンコード・デコードするために利用されます。
  • Web API のバイナリレスポンス処理
    WebAssemblyWebSocket など、バイナリデータを直接処理する API と組み合わせて使用することができます。

イディオム

[編集]

DataView を効率的に使用するための典型的なパターンを紹介します。

  • バイナリデータの読み書き
    DataView を利用して、異なるデータ型を適切に読み書きする例です。
    constbuffer=newArrayBuffer(8);constview=newDataView(buffer);// データを書き込むview.setUint32(0,0x12345678,false);// ビッグエンディアンview.setUint32(4,0x90abcdef,true);// リトルエンディアン// データを読み込むconsole.log(view.getUint32(0,false).toString(16));// "12345678"console.log(view.getUint32(0,true).toString(16));// "78563412"console.log(view.getUint32(4,false).toString(16));// "efcdab90"console.log(view.getUint32(4,true).toString(16));// "90abcdef"
  • エンディアンの考慮
    異なるエンディアン形式に対応する際のパターンです。
    functionreadInt32LE(view,offset){returnview.getInt32(offset,true);}functionreadInt32BE(view,offset){returnview.getInt32(offset,false);}constbuffer=newArrayBuffer(4);constview=newDataView(buffer);view.setInt32(0,0x11223344,true);console.log(readInt32LE(view,0).toString(16));// "11223344"console.log(readInt32BE(view,0).toString(16));// "44332211"
  • バイナリデータのシリアライズ・デシリアライズ
    DataView を使用してオブジェクトをバイナリ形式でエンコード・デコードする例。
    functionserialize(x,y,z){constbuffer=newArrayBuffer(12);constview=newDataView(buffer);view.setFloat32(0,x,true);view.setFloat32(4,y,true);view.setFloat32(8,z,true);returnbuffer;}functiondeserialize(buffer){constview=newDataView(buffer);return{x:view.getFloat32(0,true),y:view.getFloat32(4,true),z:view.getFloat32(8,true)};}constbuffer=serialize(1.1,2.2,3.3);constdata=deserialize(buffer);console.log(data);// { x: 1.1, y: 2.2, z: 3.3 }

コンストラクタ

[編集]

DataView()

[編集]
newDataView(buffer[,byteOffset[,length]])
  • 引数
    • buffer: 操作対象の ArrayBuffer オブジェクト
    • byteOffset (オプション): データビューの開始位置(デフォルトは 0)
    • length (オプション): データビューが操作するバッファの長さ(デフォルトは buffer.length
  • 戻り値: 新しい DataView オブジェクト

プロパティ

[編集]

DataView には、データを操作するためのメソッド群があり、プロパティは提供されていませんが、指定されたバッファ内のデータを読み書きするために、各メソッドを利用することができます。

メソッド

[編集]

DataView.prototype.getInt8()

[編集]
dataView.getInt8(byteOffset)
  • 引数
    • byteOffset: 読み取る位置のバイトオフセット
  • 戻り値: 8ビット符号付き整数(Int8)として解釈した値

DataView.prototype.getUint8()

[編集]
dataView.getUint8(byteOffset)
  • 引数
    • byteOffset: 読み取る位置のバイトオフセット
  • 戻り値: 8ビット符号なし整数(Uint8)として解釈した値

DataView.prototype.getInt16()

[編集]
dataView.getInt16(byteOffset[,littleEndian])
  • 引数
    • byteOffset: 読み取る位置のバイトオフセット
    • littleEndian (オプション): true の場合、リトルエンディアン形式で解釈(デフォルトは false)
  • 戻り値: 16ビット符号付き整数(Int16)として解釈した値

DataView.prototype.getUint16()

[編集]
dataView.getUint16(byteOffset[,littleEndian])
  • 引数
    • byteOffset: 読み取る位置のバイトオフセット
    • littleEndian (オプション): true の場合、リトルエンディアン形式で解釈(デフォルトは false)
  • 戻り値: 16ビット符号なし整数(Uint16)として解釈した値

DataView.prototype.getInt32()

[編集]
dataView.getInt32(byteOffset[,littleEndian])
  • 引数
    • byteOffset: 読み取る位置のバイトオフセット
    • littleEndian (オプション): true の場合、リトルエンディアン形式で解釈(デフォルトは false)
  • 戻り値: 32ビット符号付き整数(Int32)として解釈した値

DataView.prototype.getUint32()

[編集]
dataView.getUint32(byteOffset[,littleEndian])
  • 引数
    • byteOffset: 読み取る位置のバイトオフセット
    • littleEndian (オプション): true の場合、リトルエンディアン形式で解釈(デフォルトは false)
  • 戻り値: 32ビット符号なし整数(Uint32)として解釈した値

DataView.prototype.getFloat32()

[編集]
dataView.getFloat32(byteOffset[,littleEndian])
  • 引数
    • byteOffset: 読み取る位置のバイトオフセット
    • littleEndian (オプション): true の場合、リトルエンディアン形式で解釈(デフォルトは false)
  • 戻り値: 32ビット浮動小数点数(Float32)として解釈した値

DataView.prototype.getFloat64()

[編集]
dataView.getFloat64(byteOffset[,littleEndian])
  • 引数
    • byteOffset: 読み取る位置のバイトオフセット
    • littleEndian (オプション): true の場合、リトルエンディアン形式で解釈(デフォルトは false)
  • 戻り値: 64ビット浮動小数点数(Float64)として解釈した値

DataView.prototype.setInt8()

[編集]
dataView.setInt8(byteOffset,value)
  • 引数
    • byteOffset: 書き込む位置のバイトオフセット
    • value: 書き込む値(8ビット符号付き整数)
  • 戻り値: なし

DataView.prototype.setUint8()

[編集]
dataView.setUint8(byteOffset,value)
  • 引数
    • byteOffset: 書き込む位置のバイトオフセット
    • value: 書き込む値(8ビット符号なし整数)
  • 戻り値: なし

DataView.prototype.setInt16()

[編集]
dataView.setInt16(byteOffset,value[,littleEndian])
  • 引数
    • byteOffset: 書き込む位置のバイトオフセット
    • value: 書き込む値(16ビット符号付き整数)
    • littleEndian (オプション): true の場合、リトルエンディアン形式で書き込む(デフォルトは false)
  • 戻り値: なし

DataView.prototype.setUint16()

[編集]
dataView.setUint16(byteOffset,value[,littleEndian])
  • 引数
    • byteOffset: 書き込む位置のバイトオフセット
    • value: 書き込む値(16ビット符号なし整数)
    • littleEndian (オプション): true の場合、リトルエンディアン形式で書き込む(デフォルトは false)
  • 戻り値: なし

DataView.prototype.setInt32()

[編集]
dataView.setInt32(byteOffset,value[,littleEndian])
  • 引数
    • byteOffset: 書き込む位置のバイトオフセット
    • value: 書き込む値(32ビット符号付き整数)
    • littleEndian (オプション): true の場合、リトルエンディアン形式で書き込む(デフォルトは false)
  • 戻り値: なし

DataView.prototype.setUint32()

[編集]
dataView.setUint32(byteOffset,value[,littleEndian])
  • 引数
    • byteOffset: 書き込む位置のバイトオフセット
    • value: 書き込む値(32ビット符号なし整数)
    • littleEndian (オプション): true の場合、リトルエンディアン形式で書き込む(デフォルトは false)
  • 戻り値: なし

DataView.prototype.setFloat32()

[編集]
dataView.setFloat32(byteOffset,value[,littleEndian])
  • 引数
    • byteOffset: 書き込む位置のバイトオフセット
    • value: 書き込む値(32ビット浮動小数点数)
    • littleEndian (オプション): true の場合、リトルエンディアン形式で書き込む(デフォルトは false)
  • 戻り値: なし

DataView.prototype.setFloat64()

[編集]
dataView.setFloat64(byteOffset,value[,littleEndian])
  • 引数
    • byteOffset: 書き込む位置のバイトオフセット
    • value: 書き込む値(64ビット浮動小数点数)
    • littleEndian (オプション): true の場合、リトルエンディアン形式で書き込む(デフォルトは false)
  • 戻り値: なし

使用例

[編集]
letbuffer=newArrayBuffer(16);letview=newDataView(buffer);view.setInt8(0,42);console.log(view.getInt8(0));// 42

関連オブジェクト

[編集]

附録

[編集]

静的プロパティ

[編集]
DataView.length
DataView.name
DataView.prototype

静的アクセサ

[編集]

静的メソッド

[編集]

継承関係

[編集]

DataViewのインスタンスプロパティ

[編集]
DataView.prototype [ Symbol.toStringTag ]

DataViewのインスタンスアクセサ

[編集]
get DataView.prototype.buffer
get DataView.prototype.byteLength
get DataView.prototype.byteOffset

DataViewのインスタンスメソッド

[編集]
DataView.prototype.constructor()
DataView.prototype.getBigInt64()
DataView.prototype.getBigUint64()
DataView.prototype.getFloat32()
DataView.prototype.getFloat64()
DataView.prototype.getInt16()
DataView.prototype.getInt32()
DataView.prototype.getInt8()
DataView.prototype.getUint16()
DataView.prototype.getUint32()
DataView.prototype.getUint8()
DataView.prototype.setBigInt64()
DataView.prototype.setBigUint64()
DataView.prototype.setFloat32()
DataView.prototype.setFloat64()
DataView.prototype.setInt16()
DataView.prototype.setInt32()
DataView.prototype.setInt8()
DataView.prototype.setUint16()
DataView.prototype.setUint32()
DataView.prototype.setUint8()
close