请教一个protobuff的问题

protobuff序列化完成以后
生成了一个ArrayBuffer对象
现在
我想在这个对象前几个位置拼接一个int型,用来代表协议ID
服务端读取的时候
就是截取这个int型和int型之后的数据
具体要怎么操作呢???
:sweat:

尝试操作二进制数据
https://www.jianshu.com/p/8d5c78ddcda7

陈年老代码,可以参考一下,跑不跑得了就不敢保证了

 /*消息合成 ,将id和msg连接成二进制数组,其中id占用四个字节
    * @param  {number}  [id] - 消息号
    * @return {string}  [msg]  - 消息体(JSON字符串)
    **/
    toArrayBuffer:function(id,msg){
        console.log("msg类型:",typeof(msg),msg);
        //计算msg 二进制长度
        var msgarr =new Uint8Array(char2buf(msg));
        var rlength = msgarr.length + 4;
        //声明二进制数组
        var rArray = new ArrayBuffer(rlength);
        //由于二进制数组是难以直接操作的,所有要申请视图,对视图的操作可以改变二进制的内容。
        var idArr = new ArrayBuffer(4);
        var idview32 = new Uint32Array(idArr);
        idview32[0] = id;
        var idview8 = new Uint8Array(idArr);
        var rView = new Uint8Array(rArray);
        rView[0] = idview8[0] ;  //前四个字节存消息ID
        rView[1] = idview8[1] ;
        rView[2] = idview8[2] ;
        rView[3] = idview8[3] ;
        
        let k = 0;
        for(let i = 4;i<rView.length;i++){

            rView[i] = msgarr[k++];
        }
        return rView.buffer;
    }
   //char2buf
  function char2buf(str){
       var out = new ArrayBuffer(str.length*2);
       var u16a= new Uint16Array(out);
       var strs = str.split("");
       for(var i =0 ; i<strs.length;i++){
           u16a[i]=strs[i].charCodeAt();
       }
       return out;
 }

附上客户端解析消息代码

   /**
     * 解析消息,解析成 id + msgBody
     * @param{ArrayBuffer}  [data] - 二进制文件数据
     * @return {Object}            - 解析结果
     *      eg: return {"id":123,"msg":{}};
     **/
    unPackMessage:function(data){
        var msgarrView = new Uint8Array(data);
        //解析ID
        var idarr = new ArrayBuffer(4);
        let idview8 = new Uint8Array(idarr);
        idview8[0] = msgarrView[0];
        idview8[1] = msgarrView[1];
        idview8[2] = msgarrView[2];
        idview8[3] = msgarrView[3];

        let idview32 = new Uint32Array(idarr);
        let id = idview32[0];
        //去除ID,得到消息buffer
        var msgbody = new ArrayBuffer(msgarrView.length - 4);
        var msgbodyView = new Uint8Array(msgbody);
    
        let k = 0;
        for (let i = 4; i < msgarrView.length; i++) {
            msgbodyView[k++] = msgarrView[i];
        }
        return {"id":id,"msg":this.getMsgObj(id,msgbody)}   //getMsObj():据id获取消息体
    },

非常感谢:nose:
我稍后试下

可以参考我这个,一直在使用
不懂得可以回复我
https://forum.cocos.com/t/topic/71940