天天看點

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了