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

尝试操作二进制数据
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获取消息体
},
非常感谢
我稍后试下