Uint8Array 声明
let u8a=new Uint8Array();
console.log(u8a);//Uint8Array(10) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
console.log(u8a.buffer);//ArrayBuffer{} .bytelength 为10
u8a.set([,,],)
console.log(u8a);//Uint8Array(10) [15, 16, 17, 0, 0, 0, 0, 0, 0, 0]
比如说,我们想将其中的16,17,0,0拿出来组成一个新的uint8array,那有什么简单的办法,首先看官方api
uint8array 有一个方法
subarray 方法 (Uint8Array)
为此数组获取 ArrayBuffer 存储的新 Uint8Array 视图。
看下面代码
let u8a2=u8a.subarray(,);
console.log(u8a2)//Uint8Array(4) [16, 17, 0, 0]
这样大家以为这就是一个新的uint8array数组了,是自己想要的东西
但是看下面代码
虽然u8a2的长度只有4,但是它的buffer的bytelength确为10
那我们用DataView来操作下u8a2看看
let dv=new DataView(u8a2.buffer);
console.log(dv.getUint8());//输出15
上面输出的并不是我们想要的数据,我们想要的是16
所以说,这个subarray会把老uint8arry里面的buffer带过来
我的解决方案是
let u8a2-=new Uint8Array()//我们知道我们需要几个长度的数据
u8a2.set(u8a.subarray(,),)//Uint8Array(4) [16, 17, 0, 0]
console.log(u8a2.buffer)//ArrayBuffer{} .bytelength 为4
let dv=new DataView(u8a2.buffer);
console.log(dv.getUint8());//输出16
这样,就算是拷贝之前的数据,而且不用带过老的buffer了