ArrayBuffer - garevna/js-course GitHub Wiki

:mortar_board: ArrayBuffer

конструктор

Создает объект с двоичными данными в виде строки

Непосредственного доступа к данным в экземпляре ArrayBuffer нет

Доступна для чтения только длина буфера в байтах

var buffer  = new ArrayBuffer ( 16 )
console.log ( buffer.byteLength)  // 16

:mortar_board: Акцессоры

Для работы с данными экземпляра необходимо использовать конструкторы, создающие экземпляры аксессоров

  • DataView
  • Int8Array
  • Uint8Array
  • Int16Array
  • Uint16Array
  • Int32Array
  • Uint32Array
var sample  = new ArrayBuffer ( 32 )
new Uint8Array ( sample )
// ► Uint8Array(32) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
new Int16Array ( sample )
// ► Int16Array(16) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
new Uint16Array ( sample )
// ► Uint16Array(16) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
new Uint32Array ( sample )
// ► Uint32Array(8) [0, 0, 0, 0, 0, 0, 0, 0]
new Int32Array ( sample )
// ► Int32Array(8) [0, 0, 0, 0, 0, 0, 0, 0]

Результатом вызова конструкторов Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array будет итерабельный объект с числовыми данными

Для получения массива можно использовать метод ArrayFrom():

var buffer  = new ArrayBuffer ( 16 )
var sample = Array.from ( new Uint8Array ( buffer ) )
sample [0] = 50
sample [3] = 255
sample [4] = 178
console.log ( sample )
Результат в консоли:
► (16) [50, 0, 0, 255, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Однако это "дорога в одну сторону", поскольку приводит к созданию нового массива ( sample ), изменения в котором не отражаются на исходном объекте ( buffer )

DataView

С помощью этого конструктора создается экземпляр акцессора, обеспечивающего гибкий доступ к данным исходного экземпляра ArrayBuffer

var buffer  = new ArrayBuffer ( 16 )
var dataView = new DataView ( buffer )
console.log ( dataView.__proto__ )
Результат в консоли:
DataView {constructor: ƒ, getInt8: ƒ, …}
    buffer: (...)
    byteLength: (...)
    byteOffset: (...)
  ► constructor: ƒ DataView()
  ► getBigInt64: ƒ getBigInt64()
  ► getBigUint64: ƒ getBigUint64()
  ► getFloat32: ƒ getFloat32()
  ► getFloat64: ƒ getFloat64()
  ► getInt8: ƒ getInt8()
  ► getInt16: ƒ getInt16()
  ► getInt32: ƒ getInt32()
  ► getUint8: ƒ getUint8()
  ► getUint16: ƒ getUint16()
  ► getUint32: ƒ getUint32()
  ► setBigInt64: ƒ setBigInt64()
  ► setBigUint64: ƒ setBigUint64()
  ► setFloat32: ƒ setFloat32()
  ► setFloat64: ƒ setFloat64()
  ► setInt8: ƒ setInt8()
  ► setInt16: ƒ setInt16()
  ► setInt32: ƒ setInt32()
  ► setUint8: ƒ setUint8()
  ► setUint16: ƒ setUint16()
  ► setUint32: ƒ setUint32()
    Symbol(Symbol.toStringTag): "DataView"
  ► get buffer: ƒ buffer()
  ► get byteLength: ƒ byteLength()
  ► get byteOffset: ƒ byteOffset()
  ► __proto__: Object
:coffee: :one: setInt8
var buffer  = new ArrayBuffer ( 16 )
var dataView = new DataView ( buffer )
dataView.setInt8 ( 2, 78 )
dataView.setInt8 ( 3, 94 )
dataView.setInt8 ( 5, 55 )
console.log ( buffer)
Результат в консоли:
▼ ArrayBuffer(16) {}
  ► [Int8Array](/garevna/js-course/wiki/Int8Array): Int8Array(16) [0, 0, 78, 94, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  ► [Int16Array](/garevna/js-course/wiki/Int16Array): Int16Array(8) [0, 24142, 14080, 0, 0, 0, 0, 0]
  ► [Int32Array](/garevna/js-course/wiki/Int32Array): Int32Array(4) [1582170112, 14080, 0, 0]
  ► [Uint8Array](/garevna/js-course/wiki/Uint8Array): Uint8Array(16) [0, 0, 78, 94, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    byteLength: (...)
  ► __proto__: ArrayBuffer
:coffee: :two: setInt16
var buffer  = new ArrayBuffer ( 16 )
var dataView = new DataView ( buffer )
dataView.setInt16 ( 1, 78 )
dataView.setInt16 ( 3, 94 )
dataView.setInt16 ( 5, 55 )
console.log ( buffer)
Результат в консоли:
▼ ArrayBuffer(16) {}
  ► [Int8Array](/garevna/js-course/wiki/Int8Array): Int8Array(16) [0, 0, 78, 0, 94, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  ► [Int16Array](/garevna/js-course/wiki/Int16Array): Int16Array(8) [0, 78, 94, 55, 0, 0, 0, 0]
  ► [Int32Array](/garevna/js-course/wiki/Int32Array): Int32Array(4) [5111808, 3604574, 0, 0]
  ► [Uint8Array](/garevna/js-course/wiki/Uint8Array): Uint8Array(16) [0, 0, 78, 0, 94, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    byteLength: (...)
  ► __proto__: ArrayBuffer
:coffee: :three: setInt32
var buffer  = new ArrayBuffer ( 16 )
var dataView = new DataView ( buffer )
dataView.setInt16 ( 3, 78 )
dataView.setInt16 ( 7, 94 )
dataView.setInt16 ( 11, 55 )
console.log ( buffer)
Результат в консоли:
▼ ArrayBuffer(16) {}
  ► [Int8Array](/garevna/js-course/wiki/Int8Array): Int8Array(16) [0, 0, 0, 0, 78, 0, 0, 0, 94, 0, 0, 0, 55, 0, 0, 0]
  ► [Int16Array](/garevna/js-course/wiki/Int16Array): Int16Array(8) [0, 0, 78, 0, 94, 0, 55, 0]
  ► [Int32Array](/garevna/js-course/wiki/Int32Array): Int32Array(4) [0, 78, 94, 55]
  ► [Uint8Array](/garevna/js-course/wiki/Uint8Array): Uint8Array(16) [0, 0, 0, 0, 78, 0, 0, 0, 94, 0, 0, 0, 55, 0, 0, 0]
    byteLength: (...)
  ► __proto__: ArrayBuffer
:coffee: :four:
var picture = document.createElement ( 'img' )
document.body.appendChild ( picture )

var arrayBuffer, dataView

fetch ( 'https://avatars2.githubusercontent.com/u/46?v=4' )
    .then ( response => {
        response.arrayBuffer()
            .then ( response => {
                arrayBuffer = response
                dataView = new DataView ( arrayBuffer )
                var ind = 90
                while ( ind < 150 )
                    dataView.setInt8 ( ind++, 50 )
    		picture.src = URL.createObjectURL (
                    new Blob ( [ new Uint8Array ( arrayBuffer ) ] )
                )
        })
    })