JavaScript DataView — читання буфера з контролем порядку байтів


DataView — гнучке вікно в ArrayBuffer: дозволяє читати й писати числа будь-якого типу з будь-якого зсуву і явно вказувати порядок байтів.

автор: NagarD

Загальний опис

Типізований масив (Uint32Array) зручний, але жорсткий: усі елементи одного типу, вирівняні, а порядок байтів — той, який має процесор. Для власних структур це не годиться.

Двійкові формати влаштовані інакше: два байти заголовка, потім чотирибайтове число, потім рядок. DataView читає таку мішанку природно — методами getUint16(), getFloat32() з явним зсувом.

І головне — порядок байтів (endianness). Мережеві формати майже завжди big-endian, процесор — little-endian. DataView дає його третім аргументом, і ця дрібниця рятує від найпідступніших помилок розбору.

автор: NagarD

Порада

Свій формат розбираєш — бери DataView. Однорідний масив чисел — бери типізований масив: він і швидший, і коротший.

автор: NagarD

Синтаксис

const view = new DataView(buffer);

властивості

Властивість Опис
buffer Пов'язаний ArrayBuffer.
byteLength Довжина представлення в байтах.
byteOffset Зсув представлення від початку буфера.

методи

Метод Опис
getInt8 Читає знакове 8-бітне число за зсувом.
getUint8 Читає беззнакове 8-бітне число.
getInt16 Читає знакове 16-бітне число.
getInt32 Читає знакове 32-бітне число.
getFloat64 Читає 64-бітне число з рухомою комою.
setInt8 Записує знакове 8-бітне число за зсувом.
setFloat64 Записує 64-бітне число з рухомою комою.

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
DataView 9+ 15+ 5.1+ 12.1+ 12+ 10+
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
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));  // сміття, якщо порядок переплутати
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід