Int16Array: примеры (JAVASCRIPT)

Работа с типизированным массивом Int16Array в JavaScript
Раздел: Бинарные данные, Типизированные массивы
Int16Array(buffer: ArrayBuffer | length: number | array: Iterable | object): Int16Array

Основы Int16Array

Int16Array - это типизированный массив, представляющий собой представление бинарных данных в виде 16-битных целых чисел со знаком в порядке байтов платформы. Он является частью семейства типизированных массивов JavaScript, предназначенных для работы с бинарными данными.

Типизированные массивы используются для обработки бинарных данных, например, при работе с графикой, аудио, сетевыми протоколами или файловыми форматами, где важна точность представления чисел и эффективность использования памяти.

Конструкторы Int16Array

Int16Array можно создать несколькими способами:

  • new Int16Array(length) - создает массив с указанным количеством элементов (каждый элемент инициализируется нулем)
  • new Int16Array(typedArray) - создает массив из другого типизированного массива
  • new Int16Array(object) - создает массив из итерируемого объекта или обычного массива
  • new Int16Array(buffer[, byteOffset[, length]]) - создает представление ArrayBuffer с указанным смещением и длиной

Свойства и возвращаемые значения

Int16Array наследует свойства от TypedArray и ArrayBuffer:

  • BYTES_PER_ELEMENT - возвращает 2 (размер элемента в байтах)
  • buffer - ссылка на ArrayBuffer
  • byteLength - размер в байтах
  • byteOffset - смещение в байтах от начала ArrayBuffer
  • length - количество элементов в массиве

Базовые примеры использования

Создание Int16Array различными способами:

Пример 1: Создание по длине

const arr1 = new Int16Array(4);
console.log(arr1);
Int16Array(4) [ 0, 0, 0, 0 ]

Пример 2: Создание из обычного массива

const arr2 = new Int16Array([10, 20, 30, 40]);
console.log(arr2);
console.log('Размер в байтах:', arr2.byteLength);
Int16Array(4) [ 10, 20, 30, 40 ]
Размер в байтах: 8

Пример 3: Создание из ArrayBuffer

const buffer = new ArrayBuffer(8);
const arr3 = new Int16Array(buffer, 2, 3);
arr3.set([100, 200, 300]);
console.log(arr3);
console.log('Смещение:', arr3.byteOffset);
Int16Array(3) [ 100, 200, 300 ]
Смещение: 2

Пример 4: Методы работы с массивом

const arr4 = new Int16Array([5, 15, 25, 35]);
console.log('Первый элемент:', arr4[0]);
console.log('Сумма элементов:', arr4.reduce((a, b) => a + b));

const subarray = arr4.subarray(1, 3);
console.log('Подмассив:', subarray);
Первый элемент: 5
Сумма элементов: 80
Подмассив: Int16Array(2) [ 15, 25 ]

Похожие типизированные массивы в JavaScript

JavaScript предоставляет различные типизированные массивы для разных числовых форматов:

  • Int8Array - 8-битные целые со знаком (от -128 до 127)
  • Uint16Array - 16-битные целые без знака (от 0 до 65535)
  • Int32Array - 32-битные целые со знаком (больший диапазон, но больше памяти)
  • Float32Array - 32-битные числа с плавающей точкой
  • Float64Array - 64-битные числа с плавающей точкой (двойная точность)

Выбор зависит от требований к диапазону значений, точности и объему памяти. Int16Array оптимален для значений в диапазоне от -32768 до 32767 при необходимости экономии памяти по сравнению с 32-битными типами.

Типичные ошибки и проблемы

Ошибка 1: Выход за пределы диапазона значений

const arr = new Int16Array(2);
arr[0] = 40000;  // Превышает максимальное значение 32767
console.log(arr[0]);
-25536  // Произошло переполнение

Ошибка 2: Неправильное использование конструктора

try {
    const arr = new Int16Array('abc');
} catch (e) {
    console.log('Ошибка:', e.message);
}
Ошибка: Invalid array length

Ошибка 3: Изменение длины массива

const arr = new Int16Array([1, 2, 3]);
arr.length = 5;  // Типизированные массивы имеют фиксированную длину
console.log(arr.length);
3  // Длина не изменилась

Ошибка 4: Смешение типов данных

const arr = new Int16Array(3);
arr[0] = 3.14;  // Дробная часть будет отброшена
console.log(arr[0]);
3  // Дробная часть потеряна

Изменения в последних версиях

Int16Array является частью спецификации ECMAScript 6 и существенно не изменялся в последующих версиях. Однако, улучшения касаются в основном интеграции с другими возможностями языка:

  • В ES2017 улучшена поддержка итераторов и методов массива
  • В более новых версиях улучшена производительность в движках JavaScript
  • Добавлена лучшая поддержка в методах типа slice, map, filter с сохранением типа
  • Интеграция с Atomics API для многопоточных операций через Web Workers

Все современные браузеры полностью поддерживают Int16Array, включая мобильные версии.

Расширенные примеры использования

Пример 1: Обработка аудиоданных

Пример javascript
// Эмуляция обработки аудиобуфера
const sampleRate = 44100;
const duration = 1; // секунда
const samples = sampleRate * duration;
const audioBuffer = new Int16Array(samples);

// Генерация синусоидальной волны 440 Гц
for (let i = 0; i < samples; i++) {
    const time = i / sampleRate;
    audioBuffer[i] = Math.sin(2 * Math.PI * 440 * time) * 32767;
}
console.log('Аудиобуфер создан, samples:', audioBuffer.length);
console.log('Пиковое значение:', Math.max(...audioBuffer.slice(0, 100)));
Аудиобуфер создан, samples: 44100
Пиковое значение: 32767

Пример 2: Работа с бинарными протоколами

Пример javascript
// Эмуляция парсинга сетевого пакета
const packet = new ArrayBuffer(12);
const view = new Int16Array(packet);

// Заполнение заголовка пакета
view[0] = 0x4A53; // JS - идентификатор
view[1] = 0x0100; // версия 1.0
view[2] = 100;    // тип пакета
view[3] = 4;      // количество данных

// Данные пакета
const dataView = new DataView(packet);
dataView.setInt32(8, 123456, true); // little-endian

console.log('Идентификатор:', view[0].toString(16));
console.log('Данные:', dataView.getInt32(8, true));
Идентификатор: 4a53
Данные: 123456

Пример 3: Взаимодействие с WebGL

Пример javascript
// Создание буфера для индексов геометрии (треугольники)
const indexData = [
    0, 1, 2,  // первый треугольник
    2, 3, 0   // второй треугольник
];

const indexBuffer = new Int16Array(indexData);
console.log('Буфер индексов создан');
console.log('Размер буфера:', indexBuffer.byteLength, 'байт');
console.log('Индексы:', ...indexBuffer);
Буфер индексов создан
Размер буфера: 12 байт
Индексы: 0 1 2 2 3 0

Пример 4: Параллельные вычисления с Atomics

Пример javascript
// Использование в многопоточном контексте
if (typeof SharedArrayBuffer !== 'undefined') {
    const sharedBuffer = new SharedArrayBuffer(16);
    const sharedArray = new Int16Array(sharedBuffer);
    
    // Инициализация данных
    sharedArray[0] = 1;
    sharedArray[1] = 2;
    
    // Атомарная операция сложения
    Atomics.add(sharedArray, 0, 5);
    
    console.log('Результат атомарного сложения:', sharedArray[0]);
} else {
    console.log('SharedArrayBuffer не поддерживается');
}
Результат атомарного сложения: 6

Пример 5: Конвертация между типами массивов

Пример javascript
const floatArray = new Float32Array([1.5, 2.7, 3.9, 4.2]);
const int16Array = new Int16Array(floatArray.length);

// Конвертация с масштабированием
floatArray.forEach((value, index) => {
    int16Array[index] = Math.round(value * 100);
});

console.log('Исходный Float32Array:', ...floatArray);
console.log('Преобразованный Int16Array:', ...int16Array);

// Обратная конвертация
const backConverted = new Float32Array(int16Array.length);
int16Array.forEach((value, index) => {
    backConverted[index] = value / 100;
});
console.log('Восстановленный массив:', ...backConverted);
Исходный Float32Array: 1.5 2.7 3.9 4.2
Преобразованный Int16Array: 150 270 390 420
Восстановленный массив: 1.5 2.7 3.9 4.2

Аналоги в других языках программирования

Python (массивы модуля array):

import array
arr = array.array('h', [10, 20, 30, 40])  # 'h' - signed short
print(arr)
print('Размер элемента:', arr.itemsize)
array('h', [10, 20, 30, 40])
Размер элемента: 2

C (статический массив):

#include 
int main() {
    int16_t arr[4] = {10, 20, 30, 40};
    printf("Размер массива: %lu байт\n", sizeof(arr));
    return 0;
}
Размер массива: 8 байт

PHP (pack/unpack):

$data = pack('s4', 10, 20, 30, 40);  // 's' - signed short
$unpacked = unpack('s4', $data);
print_r($unpacked);
Array
(
    [1] => 10
    [2] => 20
    [3] => 30
    [4] => 40
)

Основное отличие JavaScript Int16Array - это интегрированность в язык и поддержка методов Array, тогда как в других языках часто требуются отдельные библиотеки или более низкоуровневая работа с памятью.

JS Int16Array function comments

En
Int16Array Represents an array of twos-complement 16-bit signed integers.