js下Uint8Array合并读取的方式

Uint8Array再新建的时候就固定大小了,一个模块需要一直存入流,另一个模块需要一直读取流。这样的模型发现没有,就自己写了一个,如下:

function ByteArray(){
    this.list=[];
    this.byteOffset=0;
    this.length=0;
}
var p=ByteArray.prototype;
p.push=function(unit8Arr){
    this.list.push(unit8Arr);
    this.length+=unit8Arr.length;
}
p.readBytes=function(len){
    if(len>0){
        let rbuf=new Uint8Array(len);
        let rbuf_ind=0;
        while(rbuf_ind<len){
            if(this.list.length>0){
                let tmpbuf=this.list.shift();
                let tmplen=tmpbuf.length;
                let last_len=len-rbuf_ind;
                if(tmplen>=last_len){
                    //足夠了
                    let tmpbuf2 = tmpbuf.subarray(0, last_len);
                    rbuf.set(tmpbuf2,rbuf_ind);
                    rbuf_ind+=tmpbuf2.length;
                    if(last_len<tmplen){
                        let newUint8Array = tmpbuf.subarray(last_len, tmplen);
                        this.list.unshift(newUint8Array);
                    }
                    break;
                }else{
                    rbuf.set(tmpbuf,rbuf_ind);
                    rbuf_ind+=tmplen;
                }
            }else{
                rbuf=rbuf.subarray(0, rbuf_ind);
                break;
            }
        }
        this.length-=rbuf.length;
        return rbuf;
    }
    return null;
}
module.exports=ByteArray;

使用方式:

var byte=new ByteArray();
byte.push(new Uint8Array([1,2,4,5]));
byte.push(new Uint8Array([5,3,4,5]));
byte.readBytes(2);
byte.readBytes(2);

还有个方法就是模仿go 字符串的拼接写法。先给一个缓存空间如1024,满了以后再增加1.5倍空间。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值