微信小程序 stringtoArrayBuffer

最近研究微信小程序,各种问题。为了以后避坑,在此记录此问题

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;
  },

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值