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了