050|JavaScript 解析緩存

JavaScript中可以創(chuàng)建和引用原始內(nèi)存數(shù)據(jù),這是通過(guò)數(shù)組緩存來(lái)完成的。

數(shù)組緩存(ArrayBuffer),是對(duì)一塊內(nèi)存數(shù)據(jù)的封裝,即一連串字節(jié)。數(shù)組緩存本身是無(wú)意義的,它就是一串字節(jié)。要想使它變得有意義,需要有解析器來(lái)解析這段字節(jié)。

DataView

DataView就是其中一個(gè)解析器。DataView是JavaScript中的一個(gè)類型,我們來(lái)看一下DataView的構(gòu)造函數(shù):

new DataView(buffer [, byteOffset [, byteLength]])

參數(shù)buffer指的是ArrayBuffer,byteOffset指的是從ArrayBuffer的第byteOffset個(gè)字節(jié)開(kāi)始解析,byteLength指的是只解析從byteOffset開(kāi)始的共計(jì)byteLength個(gè)字節(jié)。

通過(guò)一下例子來(lái)理解DataView:

var buffer = new ArrayBuffer(2)

var writeDataView = new DataView(buffer)
writeDataView.setInt16(0, 256) // 將第0個(gè)字節(jié)開(kāi)始,設(shè)置一個(gè)int16,值為256

var readDataView = new DataView(buffer)
console.log(readDataView.getInt16(0)) // 從第0個(gè)字節(jié),讀取一個(gè)int16

上述代碼分別創(chuàng)建了兩個(gè)DataView,一個(gè)writeDataView用于將buffer寫入數(shù)據(jù),另一個(gè)是readDataView,用于向buffer讀取數(shù)據(jù)。
我們來(lái)看一下運(yùn)行結(jié)果:

256

可以看到,writeDataView向buffer中寫了什么數(shù)據(jù),readDataView就讀出了什么數(shù)據(jù)。

TypedArray

ArrayBuffer除了可以用DataView來(lái)解析,還可以用TypedArray來(lái)解析。

TypedArray是JavaScript中的一系列類型*Array。如:

Int8Array
Uint8Array
Int16Array
Uint16Array
Int32Array
Uint32Array

可以將前述代碼的readDataView改寫成使用readDataView:

var buffer = new ArrayBuffer(2)

var writeDataView = new DataView(buffer)
writeDataView.setInt16(0, 256, true) // 將第0個(gè)字節(jié)開(kāi)始,設(shè)置一個(gè)int16,值為256

var value =  new Int16Array(buffer)[0] // 以Int16來(lái)解析數(shù)據(jù),獲取第0個(gè)元素
console.log(value) 

我們來(lái)看一下運(yùn)行結(jié)果:

256

大小端

大小端問(wèn)題指的是多字節(jié)數(shù)據(jù)排序問(wèn)題。例如256,轉(zhuǎn)換為16進(jìn)制是0x0100,由兩個(gè)字節(jié)組成:0x01、0x00。在字節(jié)序上,就擁有0x0100、0x0001兩種模式。這兩種模式就叫做大小端 。

DataView的setInt16方法默認(rèn)是大端數(shù)據(jù),而TypedArray默認(rèn)是運(yùn)行主機(jī)的模式(可能為小端,也可能為大端)。所以用DataView寫入的數(shù)據(jù),用TypedArray讀取時(shí)要注意大小端模式一致。

例如,下例中大小端模式不一埃,導(dǎo)致解析出錯(cuò):

var buffer = new ArrayBuffer(2)

var writeDataView = new DataView(buffer)
writeDataView.setInt16(0, 256) // 默認(rèn)大端

var value =  new Int16Array(buffer)[0] // 默認(rèn)主機(jī)模式,本測(cè)試機(jī)為小端
console.log(value) 

我們看一下運(yùn)行結(jié)果:

1

上例中,writeDataView以默認(rèn)的大端模式將256寫入buffer,而Int16Array以小端模式讀取,大小端模式不同,導(dǎo)致解析數(shù)據(jù)出錯(cuò),從而輸出了1。

OK,完結(jié)。

什么是繼承?
什么是prototype?
什么是proto?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容