Буфер типизированных массивов, предназначен для хранения данных в бинарном виде.
Объект данных не содержит информации о типе хранимых данных — это исключительно поток байтов. В отличии от стандартного ESMAScript, в реализации JavaScript на Iskra JS можно работать с каждым байтом информации напрямую.
// Создаем новый объект ArrayBuffer длиной 8 байт var buffer = new ArrayBuffer(8); buffer[0] = 128; // Запишется 128, так как значение в диапазоне 0-255 buffer[2] = 257; // Запишется 1, так как берутся младшие 8 бит переданного значения print(buffer); // Результат: new ArrayBuffer([128, 0, 1, 0, 0, 0, 0, 0])
Для работы с данными различных типов, хранимых в объекте ArrayBuffer
, используется экземпляр класса DataView
. В реализации JavaScript для Iskra JS, ввиду ограничений платформы, у пользователя нет доступа к конструктору объекта DataView
. Но существуют типовой набор ArrayBufferView
для работы с данными большинства необходимых типов:
Uint8Array
— массив целых чисел от 0 до 255 (2^8−1)Uint8ClampedArray
— массив целых чисел от 0 до 255 (2^8−1)Uint16Array
— массив целых чисел от 0 до 65535 (2^16−1)Uint32Array
— массив целых чисел от 0 до 4294967295 (2^32−1)Float32Array
— массив чисел с плавающей точкой одинарной точностиFloat64Array
— массив чисел с плавающей точкой двойной точности
Различие между Uint8ClampedArray
и Uint8Array
заключается в обработке значений, если они лежат вне диапазона 0–255. При работе с типизированным массивом Uint8ClampedArray
, все значение меньше 0 будут записаны как 0, а более 255 будут равны 255. При работе с типизированным массивом Uint8Array
, будет присвоено значение, формирующееся из первых 8 бит. Так число 259 (0000 0001 0000 0011
) будет записано как число 3 (0000 0011
). Аналогичным образом присваиваются значения элементов массивов Uint16Array
и Uint32Array
, с отличием в количестве используемых битов.
// Создадим типизированный массив, длинной 4 элемента. // Если при создании не указан ArrayBuffer - он будет создан автоматически нужной длины var z = new Uint8Array(4); z[0] = 123; z[2] = 321; print(z); // Выведет new Uint8Array([123, 0, 65, 0]), где 65 - это значение первых 8-и бит числа 321 // Создаем новый объект ArrayBuffer длиной 8 байт var buffer = new ArrayBuffer(8); buffer[0] = 128; // Запишет 128 в 0-й байт буфера buffer[1] = 257; // Запишет 1 в 1-й байт буфера (берутся первые 8 бит) print(buffer); // Выведет =new ArrayBuffer([128, 1, 0, 0, 0, 0, 0, 0]) // Создаем объект типизированного массива, хранящего данные в buffer // начиная с 0-го байта и длиной 2 элемента. // Для класса Uint16Array - каждый элемент занимает 2 байта (16 бит) // При указания буфера при создании - содержимое занятых байт не обнуляется var x = new Uint16Array(buffer, 0, 2); x[1] = 2343; print(x); // Выведет new Uint16Array([384, 2343]) // Так как первый элемент занимает два байта и его значение = buffer[1]*256+buffer[0] = // = 1 * 256 + 128 = 384 (присвоено ранее и не обнулено), а второй элемент - мы присвоили // обращаясь к типизированному массиву. // Создаем еще один объект типизированного массива, хранящего данные в buffer // Один буфер может содержать данные различных типов типизированных массивов var y = new Uint32Array(buffer, 4, 1); y[0] = 1234234234; print(y); // Выведет new Uint32Array([1234234234]) - типизированный массив с присвоенным нами элементу значением print(buffer); // Выведет ArrayBuffer([128, 1, 39, 9, 122, 235, 144, 73]) // где первые два элемента - это элемент x[0], // вторые два элемента - это элемент x[1], // и оставшиеся 4 элемента (32 бита) - это элемент y[0]
Работа напрямую с буферами и типизированными массивами особенно удобна, когда необходимо получить поток побайтовых данных (например из файла), и отобразить содержимое этих данных, как различные структуры или переменные.