javascript ArrayBuffer類型化數組和視圖的操作


個人理解類型化數據就是內存分配區域,不同數據的存儲就是視圖DataView咯

var buffers = [];

var json = {"id":100, "name": "中國"};
var buf = new Buffer(JSON.stringify(json));

定義一個ArrayBuffer

   var ab = new ArrayBuffer(6);//定義一個6字節的內存區域

   var abLength =  ab.byteLength;//6

   //檢查內存分配是否成功則需要abLength做比較咯

   if(abLength === 6){ //成功 }else{ //失敗 }

 

ArrayBuffer可以存放多種類型的數據,而不同類型的存儲方式就是DataView

DataView的類型如下:

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

構造DataView,new DataView(ArrayBuffer); //參數必須存在,且必須是ArrayBuffer

DataView視圖提供以下方法寫入內存:有三個參數第一個參數是字節序號,第二個參數為寫入的數據,第三個參數則為true|false可選,true為低字節寫入,默認為高字節寫入

  • setInt8:寫入1個字節的8位整數。
  • setUint8:寫入1個字節的8位無符號整數。
  • setInt16:寫入2個字節的16位整數。
  • setUint16:寫入2個字節的16位無符號整數。
  • setInt32:寫入4個字節的32位整數。
  • setUint32:寫入4個字節的32位無符號整數。
  • setFloat32:寫入4個字節的32位浮點數。
  • setFloat64:寫入8個字節的64位浮點數。

     一下方法讀取內存

  • getInt8:讀取1個字節,返回一個8位整數。
  • getUint8:讀取1個字節,返回一個無符號的8位整數。
  • getInt16:讀取2個字節,返回一個16位整數。
  • getUint16:讀取2個字節,返回一個無符號的16位整數。
  • getInt32:讀取4個字節,返回一個32位整數。
  • getUint32:讀取4個字節,返回一個無符號的32位整數。
  • getFloat32:讀取4個字節,返回一個32位浮點數。
  • getFloat64:讀取8個字節,返回一個64位浮點數。

//數據的存儲

var dv = new DataView(ab);

dv.setUint16(0, Math.pow(2, 16) - 1);

dv.setUint16(2, Math.pow(2, 16) - 2);

dv.setUint16(4, buf.length);

buffers.push(new Buffer(new Uint8Array(ab)));

buffers.push(buf);

var resBuf = Buffer.concat(buffers);//最總組合的buffer;

 

//數據的解包

var a1 = resBuf.readUInt16BE(0);//從緩存對象讀取一個 16 位無符號整型數值,以高字節序的存儲方式

var a2 = resBuf.readUInt16BE(2);

var a3 = resBuf.readUInt16BE(4);

var str = resBuf.slice(6, a3 + 6);//取字符串內容

最后,a1,a2,a3,str則為剛才存儲的數據

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM