UNPKG

pbrtools

Version:
105 lines (102 loc) 2.85 kB
/** * 根据描述创建一个buffer或者描述一个buffer * 通过描述中的属性来访问或者修改buffer的内容。 */ class binDataStruct { constructor(desc) { this.desc = desc; var sz = this.calcBufSz(desc); this.buff = new ArrayBuffer(sz); this.cook(desc, this.buff, 0); } /** * 返回[type,num] */ _gettype(str) { var st = str.indexOf('['); var ed = str.indexOf(']'); if (st < 0) { return [str, 1]; } if (ed < 0) throw 'error no ]' + str; return [str.substr(0, st), parseInt(str.substr(st + 1, ed - st - 1))]; } cook(desc, buff, off) { var off = off; desc.forEach((v) => { var av = v.split(','); if (av.length < 2) throw 'error ' + v; var ti = this._gettype(av[1]); var cls = binDataStruct.typeinfo[ti[0]][1]; var num = ti[1]; var isarr = num > 1; //问题:如果某个uint32或者f32没有按照4对齐会报错。 if (!isarr) { var dt = new cls(buff, off, 1); Object.defineProperty(this, av[0], { set: function (v) { dt[0] = v; }, get: function () { return dt[0]; }, enumerable: true, configurable: true }); } else { this[av[0]] = new cls(buff, off, num); } off += binDataStruct.typeinfo[ti[0]][0] * num; ; }); } calcBufSz(desc) { var sz = 0; desc.forEach((v) => { var av = v.split(','); if (av.length < 2) throw 'error ' + v; var ti = this._gettype(av[1]); var tp = ti[0]; var num = ti[1]; sz += binDataStruct.typeinfo[tp][0] * num; }); return sz; } attachBuff(buff, off) { this.cook(this.desc, buff, off); } } binDataStruct.typeinfo = { u8: [1, Uint8Array], u16: [2, Uint16Array], u32: [4, Uint32Array], f32: [4, Float32Array] }; /** * 根据描述字符串读写数据 */ class strDataStruct { constructor() { } desc(str) { } size() { return 0; } fromBuff(buff, off) { } toBuff(buff, off) { } } /* //var,type,defvalue var bf = new binDataStruct(['id,u16','padd,u16','dataoff,u32','datasize,u32']) as any; bf.datasize=22; //test bf = new binDataStruct(['id,u32','dt,u32[4]']) as any; bf.dt[0]=10; bf.dt[1]=11; var bb = new Uint8Array([1,2,3]); var c=new binDataStruct(['a,u8','b,u8','c,u8']) c.attachBuff(bb.buffer,0) */