UNPKG

pbrtools

Version:
136 lines (128 loc) 3.92 kB
function str2Array(str:string):number[]{ //var te = window['TextEncoder']; var te = require('text-encoding').TextEncoder; if(te){ return (new te()).encode(str) as number[]; }else{ throw('no TextEncoder support!') } } export class BufferReader{ buff:ArrayBuffer; readpos=0; viewer:DataView; init(buff:ArrayBuffer){ this.buff=buff; this.viewer = new DataView(buff,0); } readString():string{ var l = this.viewer.getUint16(this.readpos,true); this.readpos+=2; var strBuff = this.buff.slice(this.readpos,l+this.readpos); this.readpos+=l; //var texdec = window['TextDecoder'] as any; var texdec = require('text-encoding').TextDecoder; var str=''; if( texdec){ var dec = new texdec(); str = dec.decode(new Uint8Array(strBuff)) }else{ alert('不支持TextDecoder') } return str; //str = String.fromCharCode.apply(null, } readU8():number{ var r = this.viewer.getUint8(this.readpos); this.readpos++; return r; } readU16():number{ var r = this.viewer.getUint16(this.readpos,true); this.readpos+=2; return r; } readU32():number{ var r = this.viewer.getUint32(this.readpos,true); this.readpos+=4; return r; } readF32():number{ var r = this.viewer.getFloat32(this.readpos,true); this.readpos+=4; return r; } seek(pos:number){ this.readpos=pos; } } /** * 字符串的写按照先uint16 len再utf8内容的方式 */ export class BufferWriter{ buff:ArrayBuffer; datav:DataView; _writePos=0; nowrite=false; constructor(sz?:number){ if(sz>0){ this.buff = new ArrayBuffer(sz); this.datav = new DataView(this.buff); } } getStrSize(str:string){ return 2+str2Array(str).length; } wstr(str:string):BufferWriter{ var strarr = str2Array(str); this.wu16(strarr.length); if(!this.nowrite){ var udata = new Uint8Array(strarr); new Uint8Array(this.buff, this._writePos).set(udata);//TODO test } this._writePos+=strarr.length; return this; }; wu16(n:number):BufferWriter{ if(!this.nowrite) this.datav.setUint16(this._writePos,n,true); this._writePos+=2; return this; }; wu8(n:number):BufferWriter{ if(!this.nowrite) this.datav.setUint8(this._writePos,n); this._writePos++; return this; }; wu32(n:number):BufferWriter{ if(!this.nowrite) this.datav.setUint32(this._writePos,n,true); this._writePos+=4; return this; }; wf32(n:number):BufferWriter{ if(!this.nowrite) this.datav.setFloat32(this._writePos,n,true); this._writePos+=4; return this; }; wab(arraybuffer:ArrayBuffer|DataView, length?:number, offset?:number):BufferWriter { if(length==undefined || length==null) length = arraybuffer.byteLength; if(length==0)return; offset = offset ? offset : 0; if (length < 0) throw "wab error - Out of bounds"; var ab = null; if (arraybuffer instanceof ArrayBuffer) ab = arraybuffer; else if (arraybuffer.buffer) ab = arraybuffer.buffer; else throw "not arraybuffer/dataview "; if(!this.nowrite){ var uint8array = new Uint8Array(ab, offset, length); new Uint8Array(this.buff).set(uint8array,this._writePos); } this._writePos += length; //需要对齐么 return this; } }