You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 4-binary/01-arraybuffer-binary-arrays/article.md
+38-38Lines changed: 38 additions & 38 deletions
Original file line number
Diff line number
Diff line change
@@ -2,9 +2,9 @@
2
2
3
3
En el desarrollo web nos encontramos con datos binarios sobre todo al tratar con archivos (crear, cargar, descargar). Otro caso de uso típico es el procesamiento de imágenes.
4
4
5
-
Todo esto es posible en JavaScript, y las operaciones binarias son de alto rendimiento.
5
+
Todo esto es posible en JavaScript y las operaciones binarias son de alto rendimiento.
6
6
7
-
Aunque, hay un poco de confusión, porque hay muchas clases. Por nombrar algunas:
7
+
Aunque hay un poco de confusión porque hay muchas clases. Por nombrar algunas:
8
8
9
9
-`ArrayBuffer`, `Uint8Array`, `DataView`, `Blob`, `File`, etc.
10
10
@@ -37,18 +37,18 @@ Un objeto vista no almacena nada por sí mismo. Son las "gafas" las que dan una
37
37
38
38
Por ejemplo:
39
39
40
-
-**`Uint8Array`**-- trata cada byte del `ArrayBuffer` como un número separado, con valores posibles de 0 a 255 (un byte es de 8 bits, por lo que sólo puede contener esa cantidad). Este valor se denomina "entero sin signo de 8 bits".
41
-
-**`Uint16Array`**-- trata cada 2 bytes como un entero, con valores posibles de 0 a 65535. Es lo que se llama un "entero sin signo de 16 bits".
42
-
-**`Uint32Array`**-- trata cada 4 bytes como un entero, con valores posibles de 0 a 4294967295. Eso se llama "entero sin signo de 32 bits".
43
-
-**`Float64Array`**-- trata cada 8 bytes como un número de punto flotante con valores posibles desde <code>5.0x10<sup>-324</sup></code> hasta <code>1.8x10<sup>308</sup></code>.
40
+
-**`Uint8Array`**: trata cada byte del `ArrayBuffer` como un número separado, con valores posibles de 0 a 255 (un byte es de 8 bits, por lo que sólo puede contener esa cantidad). Este valor se denomina "entero sin signo de 8 bits".
41
+
-**`Uint16Array`**: trata cada 2 bytes como un entero, con valores posibles de 0 a 65535. Es lo que se llama un "entero sin signo de 16 bits".
42
+
-**`Uint32Array`**: trata cada 4 bytes como un entero, con valores posibles de 0 a 4294967295. Eso se llama "entero sin signo de 32 bits".
43
+
-**`Float64Array`**: trata cada 8 bytes como un número de punto flotante con valores posibles desde <code>5.0x10<sup>-324</sup></code> hasta <code>1.8x10<sup>308</sup></code>.
44
44
45
45
Así, los datos binarios de un `ArrayBuffer` de 16 bytes pueden interpretarse como 16 "números diminutos", u 8 números más grandes (2 bytes cada uno), o 4 aún más grandes (4 bytes cada uno), o 2 valores de punto flotante con alta precisión (8 bytes cada uno).
46
46
47
47

48
48
49
49
`ArrayBuffer` es el objeto central, la raíz de todo, los datos binarios en bruto.
50
50
51
-
Pero si vamos a escribir en él, o a iterar sobre él, básicamente para casi cualquier operación, debemos utilizar una vista, por ejemplo:
51
+
Pero si vamos a escribir en él o a iterar sobre él básicamente para casi cualquier operación, debemos utilizar una vista, por ejemplo:
52
52
53
53
```js run
54
54
let buffer =newArrayBuffer(16); // crea un búfer de longitud 16
@@ -76,13 +76,13 @@ for(let num of view) {
76
76
77
77
El término común para todas estas vistas (`Uint8Array`, `Uint32Array`, etc) es [TypedArray](https://tc39.github.io/ecma262/#sec-typedarray-objects). Comparten el mismo conjunto de métodos y propiedades.
78
78
79
-
Por favor, ten en cuenta que no hay ningún constructor llamado `TypedArray`, es sólo un término "paraguas" común para representar una de las vistas sobre `ArrayBuffer`: `Int8Array`, `Uint8Array` y así sucesivamente, la lista completa seguirá pronto.
79
+
Por favor ten en cuenta que no hay ningún constructor llamado `TypedArray`, es sólo un término "paraguas" común para representar una de las vistas sobre `ArrayBuffer`: `Int8Array`, `Uint8Array` y así sucesivamente, la lista completa seguirá pronto.
80
80
81
81
Cuando veas algo como `new TypedArray`, significa cualquiera de `new Int8Array`, `new Uint8Array`, etc.
82
82
83
83
Las matrices tipificadas se comportan como las matrices normales: tienen índices y son iterables.
84
84
85
-
Un constructor de array tipado (ya sea `Int8Array` o `Float64Array`, no importa) se comporta de forma diferente dependiendo del tipo de argumento.
85
+
Un constructor de array tipado (ya sea `Int8Array` o `Float64Array`) se comporta de forma diferente dependiendo del tipo de argumento.
86
86
87
87
Hay 5 variantes de argumentos:
88
88
@@ -98,7 +98,7 @@ new TypedArray();
98
98
99
99
Opcionalmente podemos proporcionar `byteOffset` para empezar (0 por defecto) y la `length` (hasta el final del buffer por defecto), entonces la vista cubrirá sólo una parte del `buffer`.
100
100
101
-
2. Si se da un `Array`, o cualquier objeto tipo array, se crea un array tipado de la misma longitud y se copia el contenido.
101
+
2. Si se da un `Array` o cualquier objeto tipo array se crea un array tipado de la misma longitud y se copia el contenido.
102
102
103
103
Podemos usarlo para pre-llenar el array con los datos:
104
104
@@ -110,8 +110,8 @@ new TypedArray();
110
110
alert( arr[1] ); // 1, rellenado con 4 bytes (enteros de 8 bits sin signo) con valores dados
111
111
```
112
112
113
-
3. Si se suministra otro `TypedArray`, hace lo mismo: crea un array tipado de la misma longitud y copia los valores. Los valores se convierten al nuevo tipo en el proceso, si es necesario.
114
-
4.
113
+
3. Si se suministra otro `TypedArray` hace lo mismo: crea un array tipado de la misma longitud y copia los valores. Los valores se convierten al nuevo tipo en el proceso, si es necesario.
114
+
115
115
```js run
116
116
let arr16 = new Uint16Array([1, 1000]);
117
117
*!*
@@ -121,7 +121,7 @@ new TypedArray();
121
121
alert( arr8[1] ); // 232, trató de copiar 1000, pero no puede encajar 1000 en 8 bits (explicaciones a continuación)
122
122
```
123
123
124
-
4. Para un argumento numérico `length`-- crea el array tipado para contener ese número de elementos. Su longitud en bytes será `length` multiplicada por el número de bytes de un solo elemento.
124
+
4. Para un argumento numérico `length`: crea el array tipado para contener ese número de elementos. Su longitud en bytes será `length` multiplicada por el número de bytes de un solo elemento.
125
125
126
126
`TypedArray.BYTES_PER_ELEMENT`:
127
127
```js run
@@ -130,15 +130,15 @@ new TypedArray();
130
130
alert( arr.byteLength ); // 8 (tamaño en bytes)
131
131
```
132
132
133
-
5. Sin argumentos, crea un array tipado de longitud cero.
133
+
5. Sin argumentos crea un array tipado de longitud cero.
134
134
135
-
Podemos crear un `TypedArray` directamente, sin mencionar `ArrayBuffer`. Pero una vista no puede existir sin un `ArrayBuffer` subyacente, por lo que se crea automáticamente en todos estos casos excepto en el primero (cuando se proporciona).
135
+
Podemos crear un `TypedArray` directamente sin mencionar `ArrayBuffer`. Pero una vista no puede existir sin un `ArrayBuffer` subyacente, por lo que se crea automáticamente en todos estos casos excepto en el primero (cuando se proporciona).
136
136
137
137
Para acceder al `ArrayBuffer`, hay propiedades:
138
-
-`arr.buffer`-- hace referencia al `ArrayBuffer`.
139
-
-`arr.byteLength`-- la longitud del `ArrayBuffer`.
138
+
-`arr.buffer`: hace referencia al `ArrayBuffer`.
139
+
-`arr.byteLength`: la longitud del `ArrayBuffer`.
140
140
141
-
Así, siempre podemos pasar de una vista a otra:
141
+
De esta forma siempre podemos pasar de una vista a otra:
142
142
143
143
```js
144
144
let arr8 = new Uint8Array([0, 1, 2, 3]);
@@ -149,32 +149,32 @@ let arr16 = new Uint16Array(arr8.buffer);
149
149
150
150
Esta es la lista de arrays tipados:
151
151
152
-
-`Uint8Array`, `Uint16Array`, `Uint32Array`-- para números enteros de 8, 16 y 32 bits.
153
-
-`Uint8ClampedArray`-- para números enteros de 8 bits, los "sujeta" en la asignación (ver más abajo).
154
-
-`Int8Array`, `Int16Array`, `Int32Array`-- para números enteros con signo (pueden ser negativos).
155
-
-`Float32Array`, `Float64Array`-- para números de punto flotante con signo de 32 y 64 bits.
152
+
-`Uint8Array`, `Uint16Array`, `Uint32Array`: para números enteros de 8, 16 y 32 bits.
153
+
-`Uint8ClampedArray`: para números enteros de 8 bits, los "sujeta" en la asignación (ver más abajo).
154
+
-`Int8Array`, `Int16Array`, `Int32Array`: para números enteros con signo (pueden ser negativos).
155
+
-`Float32Array`, `Float64Array`: para números de punto flotante con signo de 32 y 64 bits.
156
156
157
157
```
158
158
warn header="No `int8` or similar single-valued types"
159
159
```
160
160
161
-
Ten en cuenta que, a pesar de los nombres como `Int8Array`, no hay ningún tipo de valor único como `int` o `int8` en JavaScript.
161
+
Ten en cuenta que a pesar de los nombres como `Int8Array`, no hay ningún tipo de valor único como `int` o `int8` en JavaScript.
162
162
163
-
Esto es lógico, ya que `Int8Array` no es un array de estos valores individuales, sino una vista sobre `ArrayBuffer`.
163
+
Esto es lógico ya que `Int8Array` no es un array de estos valores individuales sino una vista sobre `ArrayBuffer`.
164
164
165
165
### Comportamiento fuera de los límites
166
166
167
167
¿Qué pasa si intentamos escribir un valor fuera de límites en un array tipado? No habrá ningún error. Pero los bits extra se cortan.
168
168
169
-
Por ejemplo, intentemos poner 256 en `Uint8Array`. En forma binaria, 256 es `100000000` (9 bits), pero `Uint8Array` sólo proporciona 8 bits por valor, lo que hace que el rango disponible sea de 0 a 255.
169
+
Por ejemplo, intentemos poner 256 en `Uint8Array`. En forma binaria 256 es `100000000` (9 bits), pero `Uint8Array` sólo proporciona 8 bits por valor, lo que hace que el rango disponible sea de 0 a 255.
170
170
171
171
Para los números más grandes, sólo se almacenan los 8 bits más a la derecha (menos significativos), y el resto se corta:
172
172
173
173

174
174
175
175
Así que obtendremos un cero.
176
176
177
-
Para el 257, la forma binaria es `100000001` (9 bits), los 8 más a la derecha se almacenan, por lo que tendremos `1` en el array:
177
+
Para el 257 la forma binaria es `100000001` (9 bits), los 8 más a la derecha se almacenan, por lo que tendremos `1` en el array:
178
178
179
179

180
180
@@ -195,7 +195,7 @@ alert(uint8array[0]); // 0
195
195
alert(uint8array[1]); // 1
196
196
```
197
197
198
-
`Uint8ClampedArray` es especial en este aspecto, su comportamiento es diferente. Guarda 255 para cualquier número que sea mayor que 255, y 0 para cualquier número negativo. Este comportamiento es útil para el procesamiento de imágenes.
198
+
`Uint8ClampedArray` es especial en este aspecto y su comportamiento es diferente. Guarda 255 para cualquier número que sea mayor que 255, y 0 para cualquier número negativo. Este comportamiento es útil para el procesamiento de imágenes.
Sin embargo, hay algunas cosas que no podemos hacer:
207
207
208
-
- No hay `splice`-- no podemos "borrar" un valor, porque los arrays tipados son vistas en un buffer, y estos son áreas fijas y contiguas de memoria. Todo lo que podemos hacer es asignar un cero.
208
+
- No hay `splice`: no podemos "borrar" un valor, porque los arrays tipados son vistas en un buffer y estos son áreas fijas y contiguas de memoria. Todo lo que podemos hacer es asignar un cero.
209
209
- No hay método `concat`.
210
210
211
211
Hay dos métodos adicionales:
212
212
213
213
-`arr.set(fromArr, [offset])` copia todos los elementos de `fromArr` al `arr`, empezando en la posición `offset` (0 por defecto).
214
-
-`arr.subarray([begin, end])` crea una nueva vista del mismo tipo desde `begin` hasta `end` (exclusivo). Es similar al método `slice` (que también está soportado), pero no copia nada -- sólo crea una nueva vista, para operar sobre el trozo de datos dado.
214
+
-`arr.subarray([begin, end])` crea una nueva vista del mismo tipo desde `begin` hasta `end` (exclusivo). Es similar al método `slice` (que también está soportado), pero no copia nada sólo crea una nueva vista, para operar sobre el trozo de datos dado.
215
215
216
216
Estos métodos nos permiten copiar arrays tipados, mezclarlos, crear nuevos arrays a partir de los existentes, etc.
217
217
@@ -228,9 +228,9 @@ La sintaxis:
228
228
newDataView(buffer, [byteOffset], [byteLength])
229
229
```
230
230
231
-
-**`buffer`**-- el `ArrayBuffer` subyacente. A diferencia de los arrays tipados, `DataView` no crea un buffer por sí mismo. Necesitamos tenerlo preparado.
232
-
-**`byteOffset`**-- la posición inicial en bytes de la vista (por defecto 0).
233
-
-**`byteLength`**-- la longitud en bytes de la vista (por defecto hasta el final del `buffer`).
231
+
-**`buffer`**: el `ArrayBuffer` subyacente. A diferencia de los arrays tipados, `DataView` no crea un buffer por sí mismo. Necesitamos tenerlo preparado.
232
+
-**`byteOffset`**: la posición inicial en bytes de la vista (por defecto 0).
233
+
-**`byteLength`**: la longitud en bytes de la vista (por defecto hasta el final del `buffer`).
234
234
235
235
Por ejemplo, aquí extraemos números en diferentes formatos del mismo buffer:
236
236
@@ -261,19 +261,19 @@ dataView.setUint32(0, 0); // poner a cero el número de 4 bytes, poniendo así t
261
261
Para hacer casi cualquier operación sobre `ArrayBuffer`, necesitamos una vista.
262
262
263
263
- Puede ser un `TypedArray`:
264
-
-`Uint8Array`, `Uint16Array`, `Uint32Array`-- para enteros sin signo de 8, 16 y 32 bits.
265
-
-`Uint8ClampedArray`-- para enteros de 8 bits, los "sujeta" en la asignación.
266
-
-`Int8Array`, `Int16Array`, `Int32Array`-- para números enteros con signo (pueden ser negativos).
267
-
-`Float32Array`, `Float64Array`-- para números de punto flotante con signo de 32 y 64 bits.
268
-
- O una `DataView`-- la vista que utiliza métodos para especificar un formato, por ejemplo `getUint8(offset)`.
264
+
-`Uint8Array`, `Uint16Array`, `Uint32Array`: para enteros sin signo de 8, 16 y 32 bits.
265
+
-`Uint8ClampedArray`: para enteros de 8 bits, los "sujeta" en la asignación.
266
+
-`Int8Array`, `Int16Array`, `Int32Array`: para números enteros con signo (pueden ser negativos).
267
+
-`Float32Array`, `Float64Array`: para números de punto flotante con signo de 32 y 64 bits.
268
+
- O una `DataView`: la vista que utiliza métodos para especificar un formato, por ejemplo `getUint8(offset)`.
269
269
270
270
En la mayoría de los casos creamos y operamos directamente sobre arrays tipados, dejando el `ArrayBuffer` a cubierto, como "denominador común". Podemos acceder a él como `.buffer` y hacer otra vista si es necesario.
271
271
272
272
También hay dos términos adicionales, que se utilizan en las descripciones de los métodos que operan con datos binarios:
273
273
-`ArrayBufferView` es un término paraguas para todos estos tipos de vistas.
274
274
- El término `BufferSource` es un término general para `ArrayBuffer` o `ArrayBufferView`.
275
275
276
-
Veremos estos términos en los próximos capítulos. El término `BufferSource` es uno de los más comunes, ya que significa "cualquier tipo de datos binarios" -- un `ArrayBuffer` o una vista sobre él.
276
+
Veremos estos términos en los próximos capítulos. El término `BufferSource` es uno de los más comunes, ya que significa "cualquier tipo de datos binarios" : un `ArrayBuffer` o una vista sobre él.
0 commit comments