`ArrayBuffer` w JavaScript
Ten artykuł wyjaśnia, czym jest ArrayBuffer
w JavaScript.
Wyjaśnimy wszystko na temat ArrayBuffer
, od podstaw, poprzez jego użycie, powiązane typy, aż po praktyczne zastosowania.
YouTube Video
ArrayBuffer
w JavaScript
ArrayBuffer
w JavaScript to obiekt służący do obsługi niskopoziomowych danych binarnych. Jest szczególnie przydatny do manipulacji danymi binarnymi w WebAPI, operacjach na plikach oraz komunikacji sieciowej.
Czym jest ArrayBuffer
ArrayBuffer
to struktura danych służąca do obsługi danych binarnych o stałej długości. Pozwala na obsługę surowych danych binarnych, które nie mogą być obsługiwane przez zwykłe tablice lub obiekty w JavaScript.
ArrayBuffer
sam w sobie nie może bezpośrednio manipulować danymi. Zamiast tego dane są odczytywane i zapisywane za pomocą TypedArray
lub DataView
na podstawie ArrayBuffer
.
ArrayBuffer
jest szczególnie przydatny w następujących sytuacjach.
- Podczas przetwarzania danych binarnych otrzymanych z sieci
- Gdy wymagane jest efektywne udostępnianie danych w
Web Worker
. - Podczas przetwarzania obrazów lub renderowania 3D za pomocą Canvas lub WebGL.
- Podczas manipulowania plikami (szczególnie plikami binarnymi).
Tworzenie ArrayBuffer
Najpierw zacznijmy od tego, jak utworzyć instancję ArrayBuffer
. ArrayBuffer
przydziela pamięć w jednostkach bajtów, więc jego rozmiar określa się podczas tworzenia.
1const buffer = new ArrayBuffer(16); // Create a 16-byte buffer
2console.log(buffer.byteLength); // 16
- W tym przykładzie przydzielany jest bufor o rozmiarze 16 bajtów. Ten bufor nie zawiera jeszcze żadnych danych.
Manipulowanie danymi za pomocą TypedArray
Nie możesz bezpośrednio uzyskać dostępu do ArrayBuffer
, więc używasz TypedArray
, aby odczytać i zapisać dane. TypedArray
oferuje różne typy widoków, takie jak Int8Array
i Float32Array
, umożliwiające efektywny dostęp do danych binarnych.
Przykład użycia Int8Array
1const buffer = new ArrayBuffer(8); // Create an 8-byte buffer
2const int8View = new Int8Array(buffer); // Create an Int8Array
3
4int8View[0] = 42; // Write data to the first byte
5console.log(int8View[0]); // 42
Int8Array
może przechowywać dane w każdym bajcie, co pozwala buforowi pomieścić 8 elementów. W ten sposób, używając różnych rodzajów widoków, można efektywnie manipulować danymi.
Inne przykłady TypedArray
JavaScript posiada różne rodzaje TypedArray
. Na przykład, jeśli chcesz obsługiwać 32-bitowe liczby całkowite bez znaku, użyj Uint32Array
.
1const buffer = new ArrayBuffer(16);
2const uint32View = new Uint32Array(buffer);
3
4uint32View[0] = 123456;
5console.log(uint32View[0]); // 123456
Uint32Array
może przechowywać dane w jednostkach 4-bajtowych, więc bufor może pomieścić cztery elementy. Ważne jest, aby wybrać odpowiedniTypedArray
w zależności od rodzaju przetwarzanych danych.
Elastyczna manipulacja danymi przy użyciu DataView
TypedArray
może obsługiwać dane tylko określonego typu, ale używając DataView
, możesz zapisywać dane dowolnego typu w dowolnym miejscu. Jest to szczególnie przydatne przy pracy z buforami zawierającymi mieszane typy danych.
1const buffer = new ArrayBuffer(16);
2const dataView = new DataView(buffer);
3
4// Write a 32-bit signed integer to byte 0
5dataView.setInt32(0, 2147483647);
6console.log(dataView.getInt32(0)); // 2147483647
7
8// Write a 16-bit unsigned integer to byte 4
9dataView.setUint16(4, 65535);
10console.log(dataView.getUint16(4)); // 65535
Korzystając z DataView
, możesz określić przesunięcie bajtowe i odczytywać lub zapisywać dane różnych typów. Jest to bardzo przydatne przy obsłudze złożonych struktur binarnych, takich jak protokoły sieciowe czy formaty plików.
Uwzględnienie kolejności bajtów (Endianness)
Podczas korzystania z DataView
należy również zwrócić uwagę na kolejność bajtów (endianness). W zależności od architektury komputera kolejność zapisu danych w pamięci może się różnić. Metody DataView
mają opcje pozwalające określić kolejność bajtów.
1const buffer = new ArrayBuffer(4);
2const view = new DataView(buffer);
3
4// Write a 32-bit integer in little-endian format
5view.setInt32(0, 42, true); // true indicates little-endian
6console.log(view.getInt32(0, true)); // 42
Jeśli nie określisz poprawnej kolejności bajtów, dane mogą być niepoprawnie interpretowane w różnych środowiskach, dlatego szczególną ostrożność należy zachować w komunikacji sieciowej lub operacjach na plikach.
Zastosowania ArrayBuffer
ArrayBuffer
to potężne narzędzie często używane w programowaniu webowym i API przeglądarki. Przyjrzyjmy się kilku przykładom zastosowań.
Odbieranie i przetwarzanie danych binarnych
Na przykład możesz pobrać dane binarne z serwera za pomocą XMLHttpRequest
lub API fetch
i obsłużyć je jako ArrayBuffer
.
1fetch('https://codesparklab.com/image.jpg')
2 .then(response => response.arrayBuffer())
3 .then(buffer => {
4 const view = new Uint8Array(buffer);
5 console.log(view);
6 });
- W tym przykładzie dane obrazu są pobierane z serwera i obsługiwane jako
Uint8Array
. W ten sposób można przetwarzać dane otrzymane z serwera za pomocąArrayBuffer
.
Zastosowanie w WebGL
W WebGL ArrayBuffer
jest używany do efektywnej obsługi danych binarnych, takich jak dane wierzchołkowe czy dane kolorów.
1const vertices = new Float32Array([
2 -1.0, -1.0,
3 1.0, -1.0,
4 1.0, 1.0,
5 -1.0, 1.0
6]);
7
8// Send data to the WebGL buffer
9const buffer = gl.createBuffer();
10gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
11gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
- W tym przykładzie
Float32Array
jest używany do zdefiniowania współrzędnych wierzchołków prostokąta i wysłania ich do bufora WebGL.
Zarządzanie pamięcią i ArrayBuffer
ArrayBuffer
zarządza pamięcią na poziomie bajtowym, co czyni go bardzo wydajnym, ale także wymaga ostrożności w zarządzaniu pamięcią. Podczas pracy z dużymi danymi binarnymi ważne jest odpowiednie zwalnianie nieużywanych ArrayBuffer
. Chociaż JavaScript automatycznie wykonuje zbieranie śmieci, ArrayBuffer
, który nadal jest referencjonowany, może powodować wycieki pamięci.
Podsumowanie
ArrayBuffer
stanowi podstawę przetwarzania danych binarnych w JavaScript. Łącząc TypedArray
i DataView
, można efektywnie i elastycznie zarządzać danymi binarnymi. Są to niezbędne narzędzia w tworzeniu stron internetowych, szczególnie w wielu sytuacjach, które wymagają przetwarzania danych binarnych, takich jak komunikacja sieciowa i WebGL. Poprzez ich właściwe zrozumienie i odpowiednie wykorzystanie można poprawić wydajność i efektywność.
Możesz śledzić ten artykuł, korzystając z Visual Studio Code na naszym kanale YouTube. Proszę również sprawdzić nasz kanał YouTube.