迭代通過 arrayBuffer
為了方便地遍歷 arrayBuffer,你可以建立一個簡單的迭代器來實現引擎蓋下的 DataView
方法:
var ArrayBufferCursor = function() {
var ArrayBufferCursor = function(arrayBuffer) {
this.dataview = new DataView(arrayBuffer, 0);
this.size = arrayBuffer.byteLength;
this.index = 0;
}
ArrayBufferCursor.prototype.next = function(type) {
switch(type) {
case 'Uint8':
var result = this.dataview.getUint8(this.index);
this.index += 1;
return result;
case 'Int16':
var result = this.dataview.getInt16(this.index, true);
this.index += 2;
return result;
case 'Uint16':
var result = this.dataview.getUint16(this.index, true);
this.index += 2;
return result;
case 'Int32':
var result = this.dataview.getInt32(this.index, true);
this.index += 4;
return result;
case 'Uint32':
var result = this.dataview.getUint32(this.index, true);
this.index += 4;
return result;
case 'Float':
case 'Float32':
var result = this.dataview.getFloat32(this.index, true);
this.index += 4;
return result;
case 'Double':
case 'Float64':
var result = this.dataview.getFloat64(this.index, true);
this.index += 8;
return result;
default:
throw new Error("Unknown datatype");
}
};
ArrayBufferCursor.prototype.hasNext = function() {
return this.index < this.size;
}
return ArrayBufferCursor;
});
然後,你可以建立一個這樣的迭代器:
var cursor = new ArrayBufferCursor(arrayBuffer);
你可以使用 hasNext
來檢查是否還有物品
for(;cursor.hasNext();) {
// There's still items to process
}
你可以使用 next
方法獲取下一個值:
var nextValue = cursor.next('Float');
使用這樣的迭代器,編寫自己的解析器來處理二進位制資料變得非常容易。