二進制數據(ArrayBuffer + TypedArray + DataView)

簡單的說,ArrayBuffer就表明了內存中的一段二進制數據,不能夠直接讀寫,只能夠經過在上面創建TypedArray視圖或DataView視圖來操做這段二進制數據,TypedArray視圖主要用來操做簡單類型的二進制數據,DataView用來操做複雜類型的二進制數據。數組

第一步:ArrayBuffer

new ArrayBuffer(length) //length表明長度,單位是字節

創建一個ArrayBuffer就是這麼簡單,固然也能夠有其它數據或對象轉換而來,這裏先不提,如此的一個對象,再借助下面將介紹的二個視圖就能夠好好利用了,不過再此以前,仍是先列舉一下幾個會有用的方法和屬性:函數

  • ArrayBuffer實例對象上有一個屬性byteLength,能夠知道實例對象的長度;
  • 實例對象上的slice(起點[,終點])方法會把原來實例對象上指定的這段數據複製新建一個新的實例對象返回;
  • ArrayBuffer對象上有一個方法ArrayBuffer.isView(參數),能夠用來判斷傳遞進去的參數ArrayBuffer的實例對象。

第二步:TypedArray

視圖對象種類

TypedArray是用來操做簡單類型的視圖,一個視圖對應一個肯定的類型,而且是連續的,默認爲0。code

該視圖支持的類型以下:對象

  • Int8Array:8位有符號整數,長度1個字節。
  • Uint8Array:8位無符號整數,長度1個字節。
  • Uint8ClampedArray:8位無符號整數,長度1個字節,溢出處理不一樣。
  • Int16Array:16位有符號整數,長度2個字節。
  • Uint16Array:16位無符號整數,長度2個字節。
  • Int32Array:32位有符號整數,長度4個字節。
  • Uint32Array:32位無符號整數,長度4個字節。
  • Float32Array:32位浮點數,長度4個字節。
  • Float64Array:64位浮點數,長度8個字節。

創建視圖對象

每種類型都有一個構造函數,用來生成對應的視圖,所以其實TypedArray實際上是這些視圖爲了方便的一個統一稱呼。內存

上面提到的每一個構造函數傳遞的參數有不少中,下面列舉經常使用的四種:get

  • TypedArray(ArrayBuffer實例對象, byteOffset=0, length?)
  • TypedArray(length)
  • TypedArray(typedArray)
  • TypedArray(普通的數組)

視圖對象操做數據

除了個別例外(好比concat方法),視圖對象的操做和普通數組的操做基本差很少,這裏給出一個例子:console

var arrayBuffer = new ArrayBuffer(6);//申請6個字節的內存空間
var int8Array = new Int8Array(arrayBuffer, 0, 2);//使用了2字節的空間
var int16Array = new Int16Array(arrayBuffer, 2, 2);//使用了4字節的空間
int8Array[0] = 1;
int16Array[0] = 2;
int16Array[1] = 3;
console.log(int8Array); //Int8Array(2) [1, 0]
console.log(int16Array); //Int16Array(2) [2, 3]

有用的說明

  • TypedArray實例對象的buffer屬性會返回對應的ArrayBuffer對象,只讀;
  • TypedArray實例對象的byteLength屬性返回對象佔據的內存字節數(注意這裏和length屬性不同,後者是成員個數),只讀;
  • TypedArray實例對象的byteOffset屬性返回對象從對應的ArrayBuffer對象的那個字節開始創建的,只讀。

第三步:DataView

new DataView(ArrayBuffer實例對象[,字節起始位置[,長度]])

和TypedArray有很大區別的是,這裏咱們在使用的時候可能要去關注一下大端仍是小端保存或讀取數據。構造函數

視圖數據操做

若是說的簡單點,其實DataView就是一個很是很是厲害視圖,提供了不少方法,不像TypedArray視圖須要創建對應視圖而後讀取,你能夠調用DataView的實例對象上的方法就能夠實現TypedArray哪些各類視圖的功能,所以,你可能會涉及到這些方法:二進制

讀數據的方法包括:getInt八、getUint八、getInt1六、getUint1六、getInt3二、getUint3二、getFloat3二、getFloat64。方法

帶二個參數,第一個參數表示讀取的開始位置,第二個參數表示是大端讀取(false)仍是小端讀取(true)。

寫數據的方法包括:setInt八、setUint八、setInt1六、setUint1六、setInt3二、setUint3二、setFloat3二、setFloat64。

帶三個參數,第一個參數表示寫入的開始位置,第二個參數表示寫入的數據,第三個參數表示是大端寫入(false)仍是小端寫入(true)。

有用的說明

  • DataView實例對象的buffer屬性會返回對應的ArrayBuffer對象,只讀;
  • DataView實例對象的byteLength屬性返回對象佔據的內存字節數(注意這裏和length屬性不同,後者是成員個數),只讀;
  • DataView實例對象的byteOffset屬性返回對象從對應的ArrayBuffer對象的那個字節開始創建的,只讀。
相關文章
相關標籤/搜索