Uint8Array 拷貝操作的坑(buffer)

Uint8Array 聲明

let u8a=new Uint8Array(10);
console.log(u8a);//Uint8Array(10) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
console.log(u8a.buffer);//ArrayBuffer{} .bytelength  爲10
u8a.set([15,16,17],0)
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(1,5);
console.log(u8a2)//Uint8Array(4) [16, 17, 0, 0]

這樣大家以爲這就是一個新的uint8array數組了,是自己想要的東西
但是看下面代碼

console.log(u8a2.buffer);//ArrayBuffer{} .bytelength  爲10

雖然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(4)//我們知道我們需要幾個長度的數據
u8a2.set(u8a.subarray(1,5),0)//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了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章