`ArrayBuffer` en JavaScript
Cet article explique ArrayBuffer
en JavaScript.
Nous expliquerons tout sur ArrayBuffer
, des bases à son utilisation, en passant par les types associés et les applications pratiques.
YouTube Video
ArrayBuffer
en JavaScript
ArrayBuffer
en JavaScript est un objet permettant de gérer des données binaires de bas niveau et est particulièrement utile pour manipuler des données binaires dans les WebAPIs, les opérations sur les fichiers et les communications réseau.
Qu'est-ce qu'ArrayBuffer
ArrayBuffer
est une structure de données utilisée pour gérer des données binaires de longueur fixe. Il permet de manipuler des données binaires brutes qui ne peuvent pas être gérées par les tableaux ou objets JavaScript classiques.
ArrayBuffer
ne peut pas directement manipuler les données. Les données sont lues et écrites en utilisant TypedArray
ou DataView
basés sur un ArrayBuffer
.
ArrayBuffer
est particulièrement utile dans les situations suivantes.
- Lors du traitement de données binaires reçues depuis le réseau
- Lorsque le partage efficace de données dans un
Web Worker
est nécessaire. - Lors du traitement d'images ou du rendu 3D avec Canvas ou WebGL.
- Lors de la manipulation de fichiers (en particulier des fichiers binaires).
Créer un ArrayBuffer
Commençons par voir comment créer une instance d'ArrayBuffer
. ArrayBuffer
alloue de la mémoire en unités d'octet, vous devez donc spécifier sa taille lors de la création.
1const buffer = new ArrayBuffer(16); // Create a 16-byte buffer
2console.log(buffer.byteLength); // 16
- Dans cet exemple, un tampon de 16 octets est alloué. Ce tampon ne contient encore aucune donnée.
Manipuler les données avec TypedArray
Vous ne pouvez pas accéder directement à un ArrayBuffer
, vous utilisez donc un TypedArray
pour lire et écrire des données. TypedArray
propose différents types de vues, comme Int8Array
et Float32Array
, permettant un accès efficace aux données binaires.
Exemple avec 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
peut stocker des données dans chaque octet, permettant ainsi au tampon de contenir 8 éléments. De cette manière, en utilisant différents types de vues, vous pouvez manipuler les données efficacement.
Autres exemples de TypedArray
JavaScript propose plusieurs types de TypedArray
. Par exemple, si vous souhaitez manipuler des entiers non signés de 32 bits, utilisez Uint32Array
.
1const buffer = new ArrayBuffer(16);
2const uint32View = new Uint32Array(buffer);
3
4uint32View[0] = 123456;
5console.log(uint32View[0]); // 123456
Uint32Array
peut stocker des données en unités de 4 octets, donc le tampon peut contenir quatre éléments. Il est important de choisir leTypedArray
approprié en fonction du type de données que vous traitez.
Manipulation flexible des données avec DataView
TypedArray
ne peut gérer que des données d'un type fixe, mais en utilisant DataView
, vous pouvez écrire des données de n'importe quel type à n'importe quel emplacement. C'est particulièrement utile lorsqu'il s'agit de buffers contenant des types de données mixtes.
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
En utilisant DataView
, vous pouvez spécifier un décalage en octets et lire ou écrire des données de différents types. Cela est très utile lors de la manipulation de structures binaires complexes telles que les protocoles réseau ou les formats de fichiers.
Considération de l'endianness
Lors de l'utilisation de DataView
, vous devez également porter attention à l'endianness (ordre des octets). Selon l'architecture de l'ordinateur, l'ordre dans lequel les données sont stockées en mémoire peut varier. Les méthodes de DataView
disposent d'options pour spécifier l'endianness.
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
Si vous ne spécifiez pas l'endianness correcte, les données pourraient ne pas être correctement interprétées dans différents environnements. Il est donc particulièrement important de faire preuve de prudence lors des communications réseau ou des opérations sur fichiers.
Applications de ArrayBuffer
ArrayBuffer
est un outil puissant souvent utilisé dans le développement web et les API des navigateurs. Voyons quelques exemples d'applications.
Réception et traitement de données binaires
Par exemple, vous pouvez récupérer des données binaires depuis un serveur en utilisant XMLHttpRequest
ou l'API fetch
, et les traiter comme un 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 });
- Dans cet exemple, des données d'image sont récupérées depuis le serveur et traitées comme un
Uint8Array
. De cette manière, vous pouvez traiter les données reçues du serveur en utilisantArrayBuffer
.
Utilisation dans WebGL
Dans WebGL, ArrayBuffer
est utilisé pour gérer efficacement des données binaires telles que les données de vertex et les données de couleur.
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);
- Dans cet exemple, un
Float32Array
est utilisé pour définir les coordonnées des sommets d'un rectangle et les envoyer à un buffer WebGL.
Gestion de la mémoire et ArrayBuffer
ArrayBuffer
gère la mémoire au niveau des octets, ce qui le rend très efficace, mais il est également nécessaire d'être attentif à la gestion de la mémoire. Lorsqu'on traite des données binaires volumineuses, il est important de libérer correctement les ArrayBuffer
inutilisés. Bien que JavaScript effectue automatiquement la récupération de mémoire (garbage collection), si un ArrayBuffer
continue d'être référencé, cela peut entraîner des fuites de mémoire.
Résumé
ArrayBuffer
constitue la base pour le traitement des données binaires en JavaScript. En combinant TypedArray
et DataView
, il est possible de manipuler efficacement et de manière flexible les données binaires. Ce sont des outils indispensables dans le développement web, en particulier dans de nombreuses situations impliquant la manipulation de données binaires telles que la communication réseau et le WebGL. En les comprenant correctement et en les utilisant de manière appropriée, vous pouvez améliorer les performances et l'efficacité.
Vous pouvez suivre l'article ci-dessus avec Visual Studio Code sur notre chaîne YouTube. Veuillez également consulter la chaîne YouTube.