Almacenar matriz de bytes en JavaScript
-
el objeto
ArrayBuffer
en JavaScript - las vistas de matriz tipificadas
-
Manipulación de
ArrayBuffer
con vistas de matriz tipeadas 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:
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:
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:
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:
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:
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.
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.