Uint8Array: примеры (JAVASCRIPT)
Uint8Array(buffer: ArrayBuffer | length: number | array: Iterable | object): Uint8ArrayОбщие сведения о Uint8Array
Uint8Array — это типизированный массив в JavaScript, представляющий массив 8-битных целых чисел без знака. Он является частью ArrayBuffer API и используется для работы с бинарными данными.
Области применения включают обработку файлов, сетевые протоколы, криптографию, компьютерную графику и взаимодействие с низкоуровневыми API.
Создание экземпляра
Конструктор принимает несколько вариантов аргументов:
- length — создает массив указанной длины, заполненный нулями.
- object — копирует данные из итерируемого объекта или массива.
- ArrayBuffer — создает представление для существующего буфера.
- buffer, byteOffset, length — создает представление части существующего буфера с указанным смещением и длиной.
Возвращает объект Uint8Array, который наследует методы TypedArray.
Основные примеры использования
Создание массива фиксированной длины:
const arr1 = new Uint8Array(3); console.log(arr1);
Uint8Array(3) [0, 0, 0]
Создание из обычного массива:
const arr2 = new Uint8Array([1, 2, 300]); console.log(arr2);
Uint8Array(3) [1, 2, 44]
Создание из строки с использованием TextEncoder:
const encoder = new TextEncoder();
const arr3 = encoder.encode('Hello');
console.log(arr3);Uint8Array(5) [72, 101, 108, 108, 111]
Альтернативные типизированные массивы в JavaScript
Для разных числовых типов доступны аналогичные конструкции:
- Int8Array — 8-битные целые со знаком (-128 до 127).
- Uint16Array — 16-битные целые без знака (0 до 65535).
- Float32Array — 32-битные числа с плавающей точкой.
- BigUint64Array — 64-битные целые без знака для больших чисел.
Для работы с сырыми буферами используется ArrayBuffer, а для манипуляций отдельными байтами — DataView.
Аналоги в других языках программирования
В Python используется модуль array или bytes:
import array
arr = array.array('B', [1, 2, 3])
print(arr)array('B', [1, 2, 3])В PHP — функция pack:
$data = pack('C*', 65, 66, 67);
echo bin2hex($data);414243
В C — массив типа uint8_t:
#include <stdint.h>
uint8_t bytes[] = {0x41, 0x42, 0x43};Распространенные ошибки
Превышение диапазона значений ведет к переполнению:
const arr = new Uint8Array([256, -1]); console.log(arr);
Uint8Array(2) [0, 255]
Использование неитерируемого объекта вызывает исключение:
try {
new Uint8Array({});
} catch (e) {
console.log(e.name);
}TypeError
Изменение буфера через разные представления:
const buffer = new ArrayBuffer(4); const view1 = new Uint8Array(buffer); const view2 = new Uint8Array(buffer); view1[0] = 0xFF; console.log(view2[0]);
255
Изменения в спецификации
В ES2023 добавлены методы toReversed, toSorted, toSpliced и with, которые возвращают новые массивы без изменения исходного.
Добавлена поддержка передачи итерируемого объекта без промежуточного массива.
Расширенные примеры применения
Объединение нескольких массивов:
const chunks = [
new Uint8Array([1, 2]),
new Uint8Array([3, 4])
];
const result = new Uint8Array(
chunks.reduce((acc, chunk) => acc + chunk.length, 0)
);
chunks.reduce((offset, chunk) => {
result.set(chunk, offset);
return offset + chunk.length;
}, 0);
console.log(result);Uint8Array(4) [1, 2, 3, 4]
Вычисление контрольной суммы:
function checksum(data) {
return data.reduce((sum, byte) => sum + byte, 0) & 0xFF;
}
const data = new Uint8Array([0x01, 0x02, 0x03]);
console.log(checksum(data).toString(16));6
Работа с битовыми масками:
const flags = new Uint8Array([0b10101010]); const isBitSet = (byte, bit) => (byte >> bit) & 1; console.log(isBitSet(flags[0], 1));
1