dataview 是 javascript 中用于任意字节顺序和数据类型读写 arraybuffer 的底层视图对象,支持从任意偏移位置按指定字节序读写不同精度数值,适用于二进制协议解析等场景。

DataView 是 JavaScript 中用于以**任意字节顺序、任意数据类型**读写 ArrayBuffer 的底层视图对象。它不关心数据的“自然对齐”或默认类型,而是让你精确控制每个字节的读写位置和格式,适合处理二进制协议、文件解析、网络数据包等场景。
为什么需要 DataView 而不是 TypedArray?
TypedArray(如 Uint8Array、Int32Array)虽然也能操作 ArrayBuffer,但有明显限制:
- 固定数据类型:一旦创建,只能按该类型(如 4 字节整数)批量访问,无法混用
float64和uint16; - 依赖平台字节序:例如
Int32Array总是按本机字节序(通常是小端),无法指定; - 起始偏移必须对齐:比如
Int32Array要求 offset 是 4 的倍数,否则抛错。
DataView 没这些限制:你可以从任意字节位置读一个 16 位大端整数,紧接着读一个 32 位小端浮点数,完全可控。
如何创建和绑定 DataView
必须传入一个 ArrayBuffer,可选指定起始字节偏移(byteOffset)和长度(byteLength):
const buffer = new ArrayBuffer(16); const view = new DataView(buffer); // 使用整个 buffer // 或 const view = new DataView(buffer, 4, 8); // 从第 4 字节开始,共 8 字节
注意:byteOffset 和 byteLength 必须在 buffer 范围内,否则抛 RangeError。
读写方法:明确字节序与类型
所有读写方法都带 byteOffset 参数(单位:字节),并支持 littleEndian 布尔选项(默认 false,即大端):
- 读:
getInt8(offset)、getUint16(offset, littleEndian)、getFloat32(offset, littleEndian)等; - 写:
setInt8(offset, value)、setUint32(offset, value, littleEndian)、setFloat64(offset, value, littleEndian)等。
例如解析一个含 header(2 字节大端长度 + 1 字节标志)的二进制块:
const buffer = new ArrayBuffer(10); const view = new DataView(buffer); view.setUint16(0, 258, false); // 写入大端 0x0102 → [0x01, 0x02] view.setUint8(2, 0x7F); // 写入标志位 → [0x7F] // 解析: const len = view.getUint16(0, false); // → 258 const flag = view.getUint8(2); // → 127
与 TypedArray 共享同一 buffer 的注意事项
DataView 和 TypedArray 可以指向同一个 ArrayBuffer,修改一方会立即反映到另一方(共享内存):
const buffer = new ArrayBuffer(8); const view = new DataView(buffer); const arr = new Uint32Array(buffer); view.setUint32(0, 0x12345678, false); // 大端写入 console.log(arr[0].toString(16)); // → "12345678"(若本机是大端)或乱值(若本机小端) // 更安全的做法:始终用 DataView 控制字节序,避免依赖本机行为
关键提醒:不要假设 TypedArray 的读写结果和 DataView 一致——除非你确认字节序匹配且内存布局对齐。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











