关于javascript:二进制数据ArrayBuffer-TypedArray-DataView

10次阅读

共计 2229 个字符,预计需要花费 6 分钟才能阅读完成。

简略的说,ArrayBuffer 就代表了内存中的一段二进制数据,不能够间接读写,只能够通过在下面建设 TypedArray 视图或 DataView 视图来操作这段二进制数据,TypedArray 视图次要用来操作简略类型的二进制数据,DataView 用来操作简单类型的二进制数据。

第一步:ArrayBuffer

new ArrayBuffer(length) //length 代表长度,单位是字节

建设一个 ArrayBuffer 就是这么简略,当然也能够有其它数据或对象转换而来,这里先不提,如此的一个对象,再借助上面将介绍的二个视图就能够好好利用了,不过再此之前,还是先列举一下几个会有用的办法和属性:

  • ArrayBuffer 实例对象上有一个属性 byteLength,能够晓得实例对象的长度;
  • 实例对象上的 slice(终点 [, 起点]) 办法会把原来实例对象上指定的这段数据复制新建一个新的实例对象返回;
  • ArrayBuffer 对象上有一个办法 ArrayBuffer.isView(参数),能够用来判断传递进去的参数 ArrayBuffer 的实例对象。

第二步:TypedArray

视图对象品种

TypedArray 是用来操作简略类型的视图,一个视图对应一个确定的类型,并且是间断的,默认为 0。

该视图反对的类型如下:

  • Int8Array:8 位有符号整数,长度 1 个字节。
  • Uint8Array:8 位无符号整数,长度 1 个字节。
  • Uint8ClampedArray:8 位无符号整数,长度 1 个字节,溢出解决不同。
  • Int16Array:16 位有符号整数,长度 2 个字节。
  • Uint16Array:16 位无符号整数,长度 2 个字节。
  • Int32Array:32 位有符号整数,长度 4 个字节。
  • Uint32Array:32 位无符号整数,长度 4 个字节。
  • Float32Array:32 位浮点数,长度 4 个字节。
  • Float64Array:64 位浮点数,长度 8 个字节。

建设视图对象

每种类型都有一个构造函数,用来生成对应的视图,因而其实 TypedArray 其实是这些视图为了不便的一个对立称说。

下面提到的每个构造函数传递的参数有很多中,上面列举罕用的四种:

  • TypedArray(ArrayBuffer 实例对象, byteOffset=0, length?)
  • TypedArray(length)
  • TypedArray(typedArray)
  • TypedArray(一般的数组)

视图对象操作数据

除了个别例外(比方 concat 办法),视图对象的操作和一般数组的操作根本差不多,这里给出一个例子:

var arrayBuffer = new ArrayBuffer(6);// 申请 6 个字节的内存空间
var int8Array = new Int8Array(arrayBuffer, 0, 2);// 应用了 2 字节的空间
var int16Array = new Int16Array(arrayBuffer, 2, 2);// 应用了 4 字节的空间
int8Array[0] = 1;
int16Array[0] = 2;
int16Array[1] = 3;
console.log(int8Array); //Int8Array(2) [1, 0]
console.log(int16Array); //Int16Array(2) [2, 3]

有用的阐明

  • TypedArray 实例对象的 buffer 属性会返回对应的 ArrayBuffer 对象,只读;
  • TypedArray 实例对象的 byteLength 属性返回对象占据的内存字节数(留神这里和 length 属性不一样,后者是成员个数),只读;
  • TypedArray 实例对象的 byteOffset 属性返回对象从对应的 ArrayBuffer 对象的那个字节开始建设的,只读。

第三步:DataView

new DataView(ArrayBuffer 实例对象[, 字节起始地位[, 长度]])

和 TypedArray 有很大区别的是,这里咱们在应用的时候可能要去关注一下大端还是小端保留或读取数据。

视图数据操作

如果说的简略点,其实 DataView 就是一个十分十分厉害视图,提供了很多办法,不像 TypedArray 视图须要建设对应视图而后读取,你能够调用 DataView 的实例对象上的办法就能够实现 TypedArray 哪些各种视图的性能,因而,你可能会波及到这些办法:

读数据的办法包含:getInt8、getUint8、getInt16、getUint16、getInt32、getUint32、getFloat32、getFloat64。

带二个参数,第一个参数示意读取的开始地位,第二个参数示意是大端读取 (false) 还是小端读取(true)。

写数据的办法包含:setInt8、setUint8、setInt16、setUint16、setInt32、setUint32、setFloat32、setFloat64。

带三个参数,第一个参数示意写入的开始地位,第二个参数示意写入的数据,第三个参数示意是大端写入 (false) 还是小端写入(true)。

有用的阐明

  • DataView 实例对象的 buffer 属性会返回对应的 ArrayBuffer 对象,只读;
  • DataView 实例对象的 byteLength 属性返回对象占据的内存字节数(留神这里和 length 属性不一样,后者是成员个数),只读;
  • DataView 实例对象的 byteOffset 属性返回对象从对应的 ArrayBuffer 对象的那个字节开始建设的,只读。

正文完
 0