var Utils = { // pack generic number arrays into byte buffer (with support for array arrays) array2buffer : function (array,typ,space) { var size=array.length,dsize=4; typ=typ||'uint32'; if (!space && Utils.isArray(array[0])) { space=[size,array[0].length]; if (Utils.isArray(array[0][0])) space.push(array[0][0].length); } if (space) size=space.reduce(function (a,b) { return a*b }); if (!space) space=[size]; switch (typ) { case 'number': dsize=8; break; case 'uint16': dsize=2; break; case 'uint32': dsize=4; break; case 'int16': dsize=2; break; case 'int32': dsize=4; break; case 'float32': dsize=4; break; case 'float64': dsize=8; break; } var b=Buffer(size*dsize); function set(v,off) { switch (typ) { case 'uint16': b.writeUInt16LE(v,off); break; case 'uint32': b.writeUInt32LE(v,off); break; case 'int16': b.writeInt16LE(v,off); break; case 'int32': b.writeInt32LE(v,off); break; case 'float32': b.writeFloatLE(v,off); break; case 'float64': case 'number': default: b.writeDoubleLE(v,off); break; } } var v,off=0; for(var i=0;i0) dsize=8; else if (typ.indexOf('32')>0) dsize=4; else if (typ.indexOf('16')>0) dsize=2; else if (typ.indexOf('8')>0) dsize=1; typ=typ.toLowerCase(); if (space) size=space.reduce(function (a,b) { return a*b }); if (!space) space=[bsize/dsize]; if (size && (size*dsize)!=buffer.length) return new Error('EINVALID'); function get(off) { switch (typ) { case 'uint8': return buffer.readUInt8(off); break; case 'uint16': return buffer.readUInt16LE(off); break; case 'uint32': return buffer.readUInt32LE(off); break; case 'int8': return buffer.readInt8(off); break; case 'int16': return buffer.readInt16LE(off); break; case 'int32': return buffer.readInt32LE(off); break; case 'float32': return buffer.readFloatLE(off); break; case 'float64': case 'number': default: return buffer.readDoubleLE(off); break; } } var v,off=0; for(var i=0;i