天天看点

Uint8Array 拷贝操作的坑(buffer)Uint8Array 声明

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了