105 lines
2.4 KiB
JavaScript
105 lines
2.4 KiB
JavaScript
'use strict';
|
|
|
|
function ArrayBufferSer(arrayBuffer) {
|
|
this.buffer = arrayBuffer;
|
|
this.offset = 0;
|
|
this.sections = this.readArray();
|
|
this.headers = this.sections[0];
|
|
this._headersIndex = {};
|
|
for(var i = 0; i < this.headers.length; ++i) {
|
|
this._headersIndex[this.headers[i]] = i;
|
|
}
|
|
if(this.sections.length > 1) {
|
|
this.length = this.sections[1].length;
|
|
}
|
|
}
|
|
|
|
ArrayBufferSer.INT8 = 1;
|
|
ArrayBufferSer.UINT8 = 2;
|
|
ArrayBufferSer.UINT8_CLAMP = 3;
|
|
ArrayBufferSer.INT16 = 4;
|
|
ArrayBufferSer.UINT16 = 5;
|
|
ArrayBufferSer.INT32 = 6;
|
|
ArrayBufferSer.UINT32 = 7;
|
|
ArrayBufferSer.FLOAT32 = 8;
|
|
//ArrayBufferSer.FLOAT64 = 9; not supported
|
|
ArrayBufferSer.STRING = 10;
|
|
ArrayBufferSer.BUFFER = 11;
|
|
|
|
|
|
ArrayBufferSer.prototype = {
|
|
|
|
sizes: [NaN, 1, 1, 1, 2, 2, 4, 4, 4, 8],
|
|
|
|
types: [
|
|
null,
|
|
Int8Array,
|
|
Uint8Array,
|
|
Uint8ClampedArray,
|
|
Int16Array,
|
|
Uint16Array,
|
|
Int32Array,
|
|
Uint32Array,
|
|
Float32Array,
|
|
Float64Array
|
|
],
|
|
|
|
get: function(columnName) {
|
|
var i = this._headersIndex[columnName]
|
|
if(i != undefined) {
|
|
return this.sections[i + 1]
|
|
}
|
|
return;
|
|
},
|
|
|
|
_paddingFor: function(offset, type) {
|
|
var s = this.sizes[type]
|
|
if(s) {
|
|
var r = offset % s;
|
|
return r == 0 ? 0 : s - r;
|
|
}
|
|
return 0;
|
|
},
|
|
|
|
readUInt32: function() {
|
|
var i = new DataView(this.buffer).getUint32(this.offset);
|
|
this.offset += 4;
|
|
return i
|
|
},
|
|
|
|
readArray: function() {
|
|
var type = this.readUInt32();
|
|
var size = this.readUInt32();
|
|
if(type < ArrayBufferSer.STRING) {
|
|
var a = new this.types[type](this.buffer, this.offset, size/this.sizes[type]);
|
|
this.offset += size;
|
|
return a;
|
|
} else if(type == ArrayBufferSer.STRING) {
|
|
var target = this.offset + size;
|
|
var b = [];
|
|
while(this.offset < target) {
|
|
this.offset += this._paddingFor(this.offset, ArrayBufferSer.INT32);
|
|
var arr = this.readArray();
|
|
if(arr) {
|
|
var str = '';
|
|
for(var i = 0; i < arr.length; ++i) {
|
|
str += String.fromCharCode(arr[i]);
|
|
}
|
|
b.push(str);
|
|
}
|
|
// parse sttring
|
|
}
|
|
return b;
|
|
} else if(type == ArrayBufferSer.BUFFER) {
|
|
var b = [];
|
|
var target = this.offset + size;
|
|
while(this.offset < target) {
|
|
this.offset += this._paddingFor(this.offset, ArrayBufferSer.INT32);
|
|
b.push(this.readArray());
|
|
}
|
|
return b;
|
|
}
|
|
}
|
|
|
|
};
|