Almacenar matriz de bytes en JavaScript

Migel Hewage Nimesha 15 febrero 2024
  1. el objeto ArrayBuffer en JavaScript
  2. las vistas de matriz tipificadas
  3. Manipulación de ArrayBuffer con vistas de matriz tipeadas en JavaScript
Almacenar matriz de bytes en JavaScript

Este artículo discutirá cómo almacenar matrices de bytes en JavaScript.

el objeto ArrayBuffer en JavaScript

Una matriz de bytes o matriz de bytes se conoce como el objeto ArrayBuffer en JavaScript. El ArrayBuffer no se deriva de las matrices de JavaScript y tiene una longitud fija en la memoria que no se puede cambiar.

Además, no puede acceder directamente a los elementos en el objeto ArrayBuffer como lo hacemos en las matrices habituales de JavaScript. Necesita un objeto de vista separado para leer/escribir.

Sintaxis:

new ArrayBuffer(length_in_bytes);

El código anterior llamará al constructor ArrayBuffer para crear una nueva instancia de ArrayBuffer con la longitud de bytes especificada.

Vamos a crear un ArrayBuuffer con una longitud de 8 bytes.

let myTypedArrayBuffer = new ArrayBuffer(8);

Idealmente, el código anterior debería crear un nuevo ArrayBuffer con un tamaño de 8 bytes. Ahora, comprobaremos la propiedad byteLength del objeto ArrayBuffer creado myTypedArrayBuffer.

Código:

console.log(myTypedArrayBuffer.byteLength);

Producción:

Comprobar el byteLength de una matriz

Como era de esperar, la longitud del búfer es de 8 bytes. Asignará 8 bytes en la memoria donde cada byte se asigna a cero.

Este búfer no proporciona ningún mecanismo para manipular sus bytes. Por lo tanto, debemos usar un objeto de vista de matriz escrito para leer/escribir en/desde el ArrayBuffer.

las vistas de matriz tipificadas

Las vistas de matriz tipeadas son como diferentes lentes que brindan una explicación de la matriz de bytes, específicamente el ArrayBuffer almacenado en la memoria. Estas vistas admiten tipos numéricos, como enteros con y sin signo y puntos flotantes.

Se han implementado las siguientes vistas para manipular el objeto ArrayBuffer.

Tipo Descripción
Uint8Array Esta vista manipula los bytes ArrayBuffer para que cada byte sea un entero separado. Dado que un byte contiene 8 bits, se pueden representar 255 enteros sin signo, y el rango de enteros es de 0 a 255.
Uint16Array Esta vista sirve para ArrayBuffer ya que cada 2 bytes en el búfer es un número entero que va de 0 a 65535. Todos los números enteros no tienen signo.
Uint32Array Cada 4 bytes en el ArrayBuffer se considera un número entero. Por lo tanto, esta vista puede almacenar más de 4 mil millones de números sin firmar.
Float64Array Float64Array puede interpretar cada 8 bytes en el búfer como un número entero.

Como puede ver, diferentes vistas le permiten interpretar datos binarios en el ArrayBuffer como diferentes formatos de números.

Manipulación de ArrayBuffer con vistas de matriz tipeadas en JavaScript

Todas las vistas de matriz tipeadas mencionadas anteriormente siguen los mismos patrones de constructores que se muestran a continuación.

new TypedArray(buffer);              // provides and ArrayBuffer type object
new TypedArray(array_object);        // provides an array-like object
new TypedArray(number_of_elements);  // provides the number of integers to be in
                                     // the typed array
new TypedArray(another_typed_array);  // provides and ArrayBuffer type object
new TypedArray();

No hay un constructor TypedArray() real en JavaScript. Será uno de los constructores de vistas como new Uint8Array(), new Float64Array().

Del ejemplo anterior, vamos a crear una nueva vista Uint8Array para manipular el ArrayBuffer(myTypedArrayBuffer) ya creado.

Código:

let unsigned8BitIntView = new Uint8Array(myTypedArrayBuffer);
console.log(unsigned8BitIntView);

Producción:

Crear nuevo Uint8Array para manipular ArrayBuffer

El objeto de matriz de tipo Uint8Array se ha creado con todos los bytes rellenos con el valor 0.

Inspeccionemos la longitud de este objeto de vista y la longitud de bytes real. Ambos deben ser 8.

Código:

console.log(
    'Length of the view: ' + unsigned8BitIntView.length +
    '.... Byte length of the view: ' + unsigned8BitIntView.byteLength);

Hemos utilizado las propiedades length y byteLength en la vista Uint8Array para obtener los dos valores anteriores.

Producción:

Compruebe la longitud de bytes real del objeto de vista

Escribamos un valor en el búfer de memoria.

unsigned8BitIntView[0] = 200;

Ahora podemos inspeccionar el objeto unsigned8BitIntView iterando cada elemento.

Código:

for (let value of unsigned8BitIntView) {
  console.log(value);
}

Producción:

Escribir valor en el búfer de memoria

Verifique el objeto unsigned8BitIntView usando la declaración de bucle

El valor 200 se ha almacenado en la matriz de bytes. Intentemos escribir 300 en la matriz de bytes.

unsigned8BitIntView[1] = 300;

Volveremos a iterar la matriz de bytes como en el ejemplo anterior.

Producción:

Verifique el objeto 8BitIntView sin firmar usando la declaración de bucle_2

Según la salida, el número entero 300 no se ha escrito en la matriz de bytes porque esta vista solo puede escribir números enteros que van desde 0 a 255.

El 300 se ignora y en su lugar se escribe como 44. A continuación se muestra cómo se genera el entero 44.

El entero 300 se puede escribir como sigue en formato binario.

100101100

Dado que esta vista interpreta enteros sin signo de 8 bits, se omitirá el primer bit y se considerarán los 8 bits restantes.

00101100

El formato binario anterior es entero 44. De la misma manera, podemos usar todas las vistas de matriz tipeadas para manipular el ArrayBuffer subyacente o la matriz de bytes en la memoria.

Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.

Artículo relacionado - JavaScript Array