====== ArrayBuffer ====== Буфер типизированных массивов, предназначен для хранения данных в бинарном виде. Объект данных не содержит информации о типе хранимых данных — это исключительно поток байтов. В отличии от стандартного 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] Работа напрямую с буферами и типизированными массивами особенно удобна, когда необходимо получить поток побайтовых данных (например из файла), и отобразить содержимое этих данных, как различные структуры или переменные.