JavaScript DataView — читання буфера з контролем порядку байтів
DataView — гнучке вікно в ArrayBuffer: дозволяє читати й писати числа будь-якого типу з будь-якого зсуву і явно вказувати порядок байтів.
Загальний опис
Типізований масив (Uint32Array) зручний, але жорсткий: усі елементи одного типу, вирівняні, а порядок байтів — той, який має процесор. Для власних структур це не годиться.
Двійкові формати влаштовані інакше: два байти заголовка, потім чотирибайтове число, потім рядок. DataView читає таку мішанку природно — методами getUint16(), getFloat32() з явним зсувом.
І головне — порядок байтів (endianness). Мережеві формати майже завжди big-endian, процесор — little-endian. DataView дає його третім аргументом, і ця дрібниця рятує від найпідступніших помилок розбору.
- Порада
-
Свій формат розбираєш — бери
автор: NagarDDataView. Однорідний масив чисел — бери типізований масив: він і швидший, і коротший.
Синтаксис
const view = new DataView(buffer);
властивості
| Властивість | Опис |
|---|---|
| buffer | Пов'язаний ArrayBuffer. |
| byteLength | Довжина представлення в байтах. |
| byteOffset | Зсув представлення від початку буфера. |
методи
| Метод | Опис |
|---|---|
| getInt8 | Читає знакове 8-бітне число за зсувом. |
| getUint8 | Читає беззнакове 8-бітне число. |
| getInt16 | Читає знакове 16-бітне число. |
| getInt32 | Читає знакове 32-бітне число. |
| getFloat64 | Читає 64-бітне число з рухомою комою. |
| setInt8 | Записує знакове 8-бітне число за зсувом. |
| setFloat64 | Записує 64-бітне число з рухомою комою. |
Переглядачі
| Переглядач | ||||||
|---|---|---|---|---|---|---|
| DataView | 9+ | 15+ | 5.1+ | 12.1+ | 12+ | 10+ |
| Переглядач | ||||
|---|---|---|---|---|
| DataView | 4+ | yes | yes | 4.2+ |
Приклади
+ запропонувати свій приклад у пісочниці
Розбір власної двійкової структури з явним порядком байтів.
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
// пишемо: 2 байти версії, далі 4 байти числа
view.setUint16(0, 1);
view.setUint32(2, 123456, false); // false = big-endian (мережевий порядок)
console.log(view.getUint16(0)); // 1
console.log(view.getUint32(2, false)); // 123456
// той самий байт, інший порядок — інше число
console.log(view.getUint32(2, true)); // сміття, якщо порядок переплутати
Коментарі
Коментарів ще немає — будьте першим!