最近研究微信小程序,各种问题。为了以后避坑,在此记录此问题
tcpsocket中的发送数据用到了ArrayBuffer。虽然tcpsocket可以直接发送string,但是很多时候需要添加一个数据包header,用来说明发送的数据大小,以及功用等,因此需要使用一个转换函数。
下面的函数就是用来给数据添加一个header,然后转换成ArrayBuffer .
//参数str是需要转换的字符串,cn是在程序中告诉服务器要执行的操作的代码
//转换部分是参考了其他朋友写的内容,可以转换中英文字符
stringToArrayBuffer: function(str,cn) {
if (typeof str === 'string'){
}else
return null;
var bytes = new Array();
var len,c;
len = str.length;
for(var i = 0; i < len; i++){
c = str.charCodeAt(i);
if(c >= 0x010000 && c <= 0x10FFFF){
bytes.push(((c >> 18) & 0x07) | 0xF0);
bytes.push(((c >> 12) & 0x3F) | 0x80);
bytes.push(((c >> 6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
}else if(c >= 0x000800 && c <= 0x00FFFF){
bytes.push(((c >> 12) & 0x0F) | 0xE0);
bytes.push(((c >> 6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
}else if(c >= 0x000080 && c <= 0x0007FF){
bytes.push(((c >> 6) & 0x1F) | 0xC0);
bytes.push((c & 0x3F) | 0x80);
}else{
bytes.push(c & 0xFF);
}
}
//36 字节header
let ab = new Int8Array(36 + bytes.length);
for(var i = 0 ;i <= bytes.length;i++){
ab[i + 36] =bytes[i];
}
let db = new DataView(ab.buffer);
db.setUint32(0,1229015365);//与服务器握手
db.setUint32(4,1312902227);//
db.setUint32(8,4);//一个功能号
db.setBigInt64(12,this.globalData.userid);//用户id
db.setUint32(24,4 + bytes.length);//后面的数据长度,字符串的长度+4
db.setUint32(32,cn);//服务器上要执行的操作代码
return db.buffer;
},