微信小程序JS 字符串string与arraybuffer的相互转换

写微信小程序用udp与服务器通信时message只可以用string和arraybuffer类型,我用了arraybuffer类型,此时涉及到string与arraybuffer的相互转换故记录所用函数以免以后忘记
通过先将字符串编码并转换为byte[],再转换为对应的arraybuffer(解析同理,先将arraybuffer转换为byte[],再进行解码)
编码及解码的过程较复杂,不过这两个函数是可以直接使用的,同时支持中文和英文。

代码局部:

 
    //字符串内容转arraybuffer
    //以下包括包头、包长和版本号,一共10个字符长度,如不需要可删除,同时把内容中的array[i+10]改为array[i]
    stringToArrayBuffer:function (str) {
      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);
        }
      }

      var array = new Int8Array(bytes.length+10);
      //包头
      array[0]=239;
      array[1]=207;
      array[2]=254;
      array[3]=252;
      //包长
      var leng=2+bytes.length;
      console.log('leng='+leng)

if(leng<=255){
  array[4]=leng;
      array[5]=0;
      array[6]=0;
      array[7]=0;
}else{
  array[4]=leng%256;
  array[5]=parseInt(leng/256);
  array[6]=0;
  array[7]=0;
}
      //版本号
      array[8]=0;
      array[9]=1;
      //内容
      for(var i=0 ;i<=bytes.length;i++){
        array[i+10] =bytes[i];
      }
      return array.buffer;
    },

//arraybuffer转字符串
     arrayBufferToString:function(arr){
      if(typeof arr === 'string') {  
          return arr;  
      }  
      var dataview=new DataView(arr.data);
      var ints=new Uint8Array(arr.data.byteLength);
      for(var i=0;i<ints.length;i++){
        ints[i]=dataview.getUint8(i);
      }
      arr=ints;
      var str = '',  
          _arr = arr;  
      for(var i = 0; i < _arr.length; i++) {  
          var one = _arr[i].toString(2),  
              v = one.match(/^1+?(?=0)/);  
          if(v && one.length == 8) {  
              var bytesLength = v[0].length;  
              var store = _arr[i].toString(2).slice(7 - bytesLength);  
              for(var st = 1; st < bytesLength; st++) {  
                  store += _arr[st + i].toString(2).slice(2);  
              }  
              str += String.fromCharCode(parseInt(store, 2));  
              i += bytesLength - 1;  
          } else {  
              str += String.fromCharCode(_arr[i]);  
          }  
      }  
      return str; 
  },

  submit:function(e){
    console.log('登陆按钮被点击了');
    if(this.data.user_name.length==0||this.data.user_pwd==0){
      wx.showToast({
        title: '账号或密码为空',
        icon: "none",
        duration: 1000
      })
      console.log(this.data.user_name)
    }else{
    const udp = wx.createUDPSocket()
    udp.bind()
    udp.send({
  
      address:'自己的地址',
      port: '自己的端口号',
      
      // message:'{\n"operate":"user_login",\n'+
      // '"user_name":"'+this.data.user_name+'",\n'+
      // '"user_pwd":"'+this.data.user_pwd+'",\n'+
      // '"chip_id":"1"\n}'
      message: this.stringToArrayBuffer(
        '{"chip_id":"xxxxx",'
        +'"operate":"user_login",'+
      '"user_name":"'+this.data.user_name+'",'+
      '"user_pwd":"'+this.data.user_pwd+'"}'),
    })
    
    udp.onMessage(
      (res)=>{
           console.log(res.message)
      }
   
    )
    }
    


  },

所传数据包如下在这里插入图片描述