迭代通过 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');
使用这样的迭代器,编写自己的解析器来处理二进制数据变得非常容易。