javascript基础从小白到高手系列三十九:DataView
API 支持对缓冲数据的高度控制,但相比于其他类型的视图性能也差一些。部分ArrayBuffer,且维护着对该缓冲实例的引用,以及视图在缓冲中开始的位置。// byteOffset=8 表示视图从缓冲的第9 个字节开始。// byteOffset=0 表示视图从缓冲起点开始。// byteLength=8 限制视图为前8 个字节。// 如果不指定,则DataView 会使用剩余的缓冲。// byt
第一种允许你读写ArrayBuffer 的视图是DataView。这个视图专为文件I/O 和网络I/O 设计,其
API 支持对缓冲数据的高度控制,但相比于其他类型的视图性能也差一些。DataView 对缓冲内容没有
任何预设,也不能迭代。
必须在对已有的ArrayBuffer 读取或写入时才能创建DataView 实例。这个实例可以使用全部或
部分ArrayBuffer,且维护着对该缓冲实例的引用,以及视图在缓冲中开始的位置。
const buf = new ArrayBuffer(16);
// DataView 默认使用整个ArrayBuffer
const fullDataView = new DataView(buf);
alert(fullDataView.byteOffset); // 0
alert(fullDataView.byteLength); // 16
alert(fullDataView.buffer === buf); // true
// 构造函数接收一个可选的字节偏移量和字节长度
// byteOffset=0 表示视图从缓冲起点开始
// byteLength=8 限制视图为前8 个字节
const firstHalfDataView = new DataView(buf, 0, 8);
alert(firstHalfDataView.byteOffset); // 0
alert(firstHalfDataView.byteLength); // 8
alert(firstHalfDataView.buffer === buf); // true
// 如果不指定,则DataView 会使用剩余的缓冲
// byteOffset=8 表示视图从缓冲的第9 个字节开始
// byteLength 未指定,默认为剩余缓冲
const secondHalfDataView = new DataView(buf, 8);
alert(secondHalfDataView.byteOffset); // 8
alert(secondHalfDataView.byteLength); // 8
alert(secondHalfDataView.buffer === buf); // true
要通过DataView 读取缓冲,还需要几个组件。
首先是要读或写的字节偏移量。可以看成DataView 中的某种“地址”。
DataView 应该使用ElementType 来实现JavaScript 的Number 类型到缓冲内二进制格式的转
换。
最后是内存中值的字节序。默认为大端字节序。
- ElementType
DataView 对存储在缓冲内的数据类型没有预设。它暴露的API 强制开发者在读、写时指定一个
ElementType,然后DataView 就会忠实地为读、写而完成相应的转换。
ECMAScript 6 支持8 种不同的ElementType(见下表)。
ElementType 字 节 说 明 等价的C 类型 值的范围
Int8 1 8 位有符号整数 signed char 128~127
Uint8 1 8 位无符号整数 unsigned char 0~255
Int16 2 16 位有符号整数 short 32 768~32 767
Uint16 2 16 位无符号整数 unsigned short 0~65 535
Int32 4 32 位有符号整数 int 2 147 483 648~2 147 483 647
Uint32 4 32 位无符号整数 unsigned int 0~4 294 967 295
Float32 4 32 位IEEE-754 浮点数 float 3.4e+38~+3.4e+38
Float64 8 64 位IEEE-754 浮点数 double 1.7e+308~+1.7e+308
DataView 为上表中的每种类型都暴露了get 和set 方法,这些方法使用byteOffset(字节偏移
量)定位要读取或写入值的位置。类型是可以互换使用的,如下例所示:
// 在内存中分配两个字节并声明一个DataView
const buf = new ArrayBuffer(2);
const view = new DataView(buf);
// 说明整个缓冲确实所有二进制位都是0
// 检查第一个和第二个字符
alert(view.getInt8(0)); // 0
alert(view.getInt8(1)); // 0
// 检查整个缓冲
alert(view.getInt16(0)); // 0
// 将整个缓冲都设置为1
// 255 的二进制表示是11111111(2^8 - 1)
view.setUint8(0, 255);
// DataView 会自动将数据转换为特定的ElementType
// 255 的十六进制表示是0xFF
view.setUint8(1, 0xFF);
// 现在,缓冲里都是1 了
// 如果把它当成二补数的有符号整数,则应该是-1
alert(view.getInt16(0)); // -1
更多推荐
所有评论(0)