個人理解類型化數據就是內存分配區域,不同數據的存儲就是視圖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則為剛才存儲的數據