Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
P9
  • Loading branch information
Purusah committed Jan 9, 2022
commit 811015957b3b53eb74c6ee1908b48264d1d46b77
26 changes: 13 additions & 13 deletions 4-binary/01-arraybuffer-binary-arrays/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
Хоча й велика кількість різних класів може спантеличити. Деякі з них:
- `ArrayBuffer`, `Uint8Array`, `DataView`, `Blob`, `File` тощо.

Бінарні дані в JavaScript реалізовано не так, як це переважно роблять в інших мовах програмування. Але, якщо трошки розібратися, все виявиться досить простим.
Бінарні дані в JavaScript реалізовано не так, як в інших мовах програмування. Але, якщо трошки розібратися, все виявиться досить простим.

**Базовим об’єктом для роботи з бінарними даними є `ArrayBuffer` -- посилання на неперервну область пам’яті фіксованої довжини.**

Expand All @@ -26,7 +26,7 @@ alert(buffer.byteLength); // 16
- Для доступу до окремих байтів нам знадобиться окремий об’єкт представлення, `buffer[index]` не спрацює.
```

`ArrayBuffer` - область пам’яті. Що там зберігається? Інформації про це немає. Просто послідовність байтів.
`ArrayBuffer` - область пам’яті. Що там зберігається? Просто послідовність байтів, що можна інтерпретувати як нам потрібно.

**Для роботи з `ArrayBuffer` нам потрібен спеціальний об’єкт "представлення".**

Expand Down Expand Up @@ -56,10 +56,10 @@ let view = new Uint32Array(buffer); // представлення буферу
alert(Uint32Array.BYTES_PER_ELEMENT); // 4 байти на кожне число
*/!*

alert(view.length); // 4, стільки чисел вміщає буфер
alert(view.length); // 4, стільки чисел вміщує буфер
alert(view.byteLength); // 16, розмір в байтах

// запишімо туди значення
// запишемо туди значення
view[0] = 123456;

// переберемо всі значення
Expand Down Expand Up @@ -91,7 +91,7 @@ new TypedArray(length);
new TypedArray();
```

1. Якщо передається аргумент типу`ArrayBuffer`, то об’єкт представлення створюється для нього. Ми вже використовувати такий синтаксис.
1. Якщо передається аргумент типу `ArrayBuffer`, то об’єкт представлення створюється для нього. Ми вже використовувати такий синтаксис.

Необов’язкові аргументи: `byteOffset` вибору зміщення від початку (типове значення 0) та `length` (типове значення відповідає кінцю) - дозволяють працювати з частиною даних з `buffer`.

Expand All @@ -115,7 +115,7 @@ new TypedArray();
alert( arr8[1] ); // 232, спроба скопіювати 1000, але 8 біт не можуть вмістити число 1000 (пояснення нижче)
```

4. Для числових аргументів `length` -- створить типізований масив із відповідним числом елементів. Його довжиною в байтах буде `length` помноженим на кількість байтів в одному елементі `TypedArray.BYTES_PER_ELEMENT`:
4. З числовим аргументом `length` буде створено типізований масив із відповідним числом елементів. Його довжиною в байтах буде `length` помноженим на кількість байтів в одному елементі `TypedArray.BYTES_PER_ELEMENT`:
```js run
let arr = new Uint16Array(4); // створить типізований масив для 4 цілих чисел
alert( Uint16Array.BYTES_PER_ELEMENT ); // 2 байт на число
Expand Down Expand Up @@ -156,9 +156,9 @@ let arr16 = new Uint16Array(arr8.buffer);

Що буде у випадку спроби записати значення, що не вміщується в область допустимих значень? Це не призведе до помилки, але зайві біти значення буде відкинуто.

Наприклад, запишімо 256 в `Uint8Array`. В бінарному форматі 256 це `100000000` (9 біт), але `Uint8Array` дозволяє тільки 8 біт для одного значення, тобто значення від 0 до 255.
Наприклад, запишемо 256 в `Uint8Array`. В бінарному форматі 256 це `100000000` (9 біт), але `Uint8Array` дозволяє тільки 8 біт для одного значення, тобто значення від 0 до 255.

Для більших чисел тільки праві (найменш важливі) 8 біт буде збережено, а решту буде обрізано.
Для більших чисел тільки праві (найменш значущі) 8 біт буде збережено, а решту буде обрізано.

![](8bit-integer-256.svg)

Expand Down Expand Up @@ -191,7 +191,7 @@ alert(uint8array[1]); // 1

Методи `TypedArray` в цілому збігаються з методами звичайного `Array`, але є деякі відмінності.

Ми можемо його перебирати `map`, `slice`, `find`, `reduce` тощо.
Ми можемо його перебирати з використанням `map`, `slice`, `find`, `reduce` тощо.

Але є речі, що ми не можемо зробити:

Expand All @@ -201,7 +201,7 @@ alert(uint8array[1]); // 1
Існує 2 додаткових методи:

- `arr.set(fromArr, [offset])` копіює всі елементи, що починаються з `offset` (типово з 0) з `fromArr` в `arr`.
- `arr.subarray([begin, end])` створює нове представлення такого ж типу починаючи з `begin` до `end` (не включно). Це схоже на метод `slice` (також підтримується), але значення не буде скопійовано -- тільки створюється нове представлення для роботи з тими самими даними.
- `arr.subarray([begin, end])` створює нове представлення такого ж типу починаючи з `begin` до `end` (не включно). Це схоже на метод `slice` (що також підтримується), але значення не буде скопійовано -- тільки створюється нове представлення для роботи з тими самими даними.

Ці методи дають змогу копіювати типізовані масиви, змішувати їх, створювати нові ґрунтуючись на попередніх і так далі.

Expand All @@ -224,7 +224,7 @@ new DataView(buffer, [byteOffset], [byteLength])
- **`byteOffset`** -- початкова позиція представлення (типове значення 0).
- **`byteLength`** -- довжина представлення в байтах (типове значення дорівнює кінцю `buffer`).

На приклад, тут ми дістаємо числа в різному форматі з одного й того ж самого буферу:
Наприклад, тут ми дістаємо числа в різному форматі з одного й того ж самого буферу:

```js run
// бінарний масив довжиною 4 байти, всі числа мають максимальне значення 255
Expand All @@ -244,7 +244,7 @@ alert( dataView.getUint32(0) ); // 4294967295 (найбільше 32-бітов
dataView.setUint32(0, 0); // встановити 4-байтове число в нуль, тобто запити всі байти як 0
```

`DataView` зручне для використання, коли ми зберігаємо дані різного формату в одному буфері. На приклад, коли ми зберігаємо послідовність пар (16-бітове ціле число, 32-бітове число з плаваючою комою), `DataView` дозволяє легко отримати до них доступ.
`DataView` зручне для використання, коли ми зберігаємо дані різного формату в одному буфері. Наприклад, коли ми зберігаємо послідовність пар (16-бітове ціле число, 32-бітове число з плаваючою комою), `DataView` дозволяє легко отримати до них доступ.

## Підсумки

Expand All @@ -259,7 +259,7 @@ dataView.setUint32(0, 0); // встановити 4-байтове число в
- `Float32Array`, `Float64Array` -- для чисел з плаваючою комою зі знаком довжиною 32 та 64 біти.
- Чи `DataView` -- представлення, яке дозволяє вибрати формат даних за допомогою методів як `getUint8(offset)`.

В більшості випадків ми маємо справу безпосередньо з типізованими масивами, а `ArrayBuffer` залишається прихованим. Якщо необхідно, можливо отримати доступ до буферу за допомогою `.buffer` та створити нове представлення.
У більшості випадків ми маємо справу безпосередньо з типізованими масивами, а `ArrayBuffer` залишається прихованим. Якщо необхідно, можливо отримати доступ до буферу за допомогою `.buffer` та створити нове представлення.

Також для опису методів, що дозволяють працювати з бінарними даними існує два додаткових терміни:
- `ArrayBufferView` - загальна назва представлень всіх типів.
Expand Down