二进制数组
二进制数组由3类对象组成:
1.**ArrayBuffer对象:**代表内存
中的一段二进制数据,可以通过“视图”进行操作。“视图”部署了数组接口,这意味着,可以用数组的方法操作内存。
2.**TypedArray视图:**共包括9种类型的视图
,比如Uint8Array(无符号8位整数)数组视图、Int16Array(16位整数)数组视图、Float32Array(32位浮点数)数组视图等。
3.**DateView视图:**可以自定义复合格式的视图
,比如第一个字节是Unit8(无符号8位整数)、第二个和第三个字节是Init16(16位整数)等,此外还可以自定义节序。
ArrayBuffer对象
ArrayBuffer对象代表存储二进制数据的一段内存,他不能直接读/写
,只能通过视图(TypedArray视图和DateView视图)读/写,视图的作用是以指定格式解读二进制数据。
TypedArray视图
ArrayBuffer对象作为内存区域可以存放多种类型的数据。同一段内存,不同数据有不同的解读方式,这就叫作“视图”。
ArrayBuffer有两种视图,一种是TypedArray
视图,另一种是ArrayBuffer视图
。前者的数组成员都是同一个数据类型
,后者的数组可以是不同的数据类型
。
TypedArray视图共有9种类型,每一种视图都是一宗构造函数。
- 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数组的所有成员都是统一类型。
- TypedArray数组的成员是连续的,不会有空位。
- TypedArray数组成员的默认值为0.
//创建一个指向b的Int16视图,开始于字节2,长度为2
var v3-=new Int16Array(b,2,2)
视图构造函数接受3个参数:
- 第一个参数(必需):视图对应的底层ArrayBuffer对象。
- 第二个参数(可选):视图
开始的字节序号
,默认是从0开始。 - 第三个参数(可选):视图包含的
数据个数
,默认直到本段内存区域结束。。
DateView视图
DateView视图提供更多操作选项,而且支持设定字节序。在设计的目的上,ArrayBuffer对象的各种TypedArray视图用于向网卡、声卡之类的本级设备传送数据,所以使用本机的字节序即可;而DateView视图用于处理网络设备传来的数据,所以大端字节序或小端字节可以自行设定。
DateView实例有以下属性,含义与ArrayBuffer实例的同名方法相同,
- DateView:prototype.buffer:返回对应的ArrayBuffer对象。
- DateView:prototype.byteLength:返回占据内存字节长度。
- DateView:prototype.byteOffset:返回当前视图从对应的ArrayBuffer对象的哪个字节开始。
DateView实例提供8个方法读取内存:
- getInt8:读取1个字节,返回一个8位整数。
- getUint8:读取1个字节,返回一个无符号的8位整数。
- getInt16:读取2个字节,返回一个16位整数。
- getUint16:读取2个字节,返回一个无符号的16位整数。
- getInt32:读取4个字节,返回一个32位整数。
- getUint32:读取4个字节,返回一个无符号的32位整数。
- getFloat32:读取4个字节,返回一个32位浮点数。
- getFloat64:读取8个字节,返回一个64位浮点数。
这一系列get方法的参数都是一个字节序号(不能是负数,否则会报错),表示从哪个字节开始读取。
//从第1个字节读取一个8位无符号整数
var v1=dv.getUint8(0);
DateView实例提供8个方法写入内存:
- setInt8:写入个字节,返回一个8位整数。
- setUint8:写入1个字节,返回一个无符号的8位整数。
- setInt16:写入2个字节,返回一个16位整数。
- setUint16:写入2个字节,返回一个无符号的16位整数。
- setInt32:写入4个字节,返回一个32位整数。
- setUint32:写入4个字节,返回一个无符号的32位整数。
- setFloat32:写入4个字节,返回一个32位浮点数。
- setFloat64:写入8个字节,返回一个64位浮点数。
set方法接受两个参数:第一个参数是字节序号,表示从哪个字节开始写入;第二个参数为写入的数据。对于那些写入两个或两个以上字节的方法,需要指定第三个参数,false或undefined表示使用大端字节序号写入true表示使用小端字节好写入。
//在第1个字节,以大端字节写入序写入值为25的32位整数
dv.setInt32(0,25,false);
二进制数组的应用
AJAX
允许服务器上返回二进制数据,这是分两种情况:如果明确知道返回的二进制数据类型,可以把返回类型(responseType)设置为arreybuffer;如果不知道,就设置为blod.
Canvas
网页Canvas元素输出的二进制像素数据就是TypeArray数组。
Fetch API
Fetch API取回的数据就是ArrayBuffer对象。
File API
如果知道一个文件的二进制数据类型,也可以将这个文件读取为ArrayBuffer对象。