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

Использование 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

JS Uint8Array function comments

En
Uint8Array Represents an array of 8-bit unsigned integers.