微信小程序 异或和计算

在写蓝牙小程序时候会涉及到对发送的信息和返回的信息进行校验,使用的是异或校验,其目的就是为了检测传输数据过程中有没有数据丢失。我项目中使用的原理——字符串以" " 开 头 , 以 " ∗ " ( 星 号 ) 结 尾 , 检 测 "开头,以"*"(星号)结尾,检测 """(之间的assic值的异或和,即第一位与第二位的异或结果与第三位再进行异或,一直到最后一位。将获取到的异或和结果放到后,生成“$XXXXXXXXXXXX*Y"的格式通过蓝牙发送出去。其中Y是生成的异或和

yihuohe1:function(char){
  var that=this;
  let string=char
  let num_front=that.strToHexCharCode(string[1])//获取首位的10进制数
  for(let i=0;i<string.length;i++)
  {
   if(string[i]=='*'){
     
    for(let j=1;j<i-1;j++){//对于*前的assic进行转10进制,再做异或和
      num_front=num_front^((that.strToHexCharCode(string[j+1])))
    }
    if(((num_front).toString(16)).length==2){
      var b=(num_front).toString(16)
      var a=b.toUpperCase()

      return a
}
    if(((num_front).toString(16)).length==1)
    {
      return ('0'+(num_front).toString(16)).toUpperCase()
    }
  }
}
},

因为对方检测的是对异或和逐位检测,用的是ASSIC,所以我在return (‘0’+(num_front).toString(16)).toUpperCase()中使用了个toUpperCase()强制把小写改成大写
接下来我们测试下效果:

  test:function(){
    let b=this.yihuohe1('$HC13,28.39478985,112.75924959,28.39478987,112.75924959,28.39478987,112.75924955,28.39478987,112.75924955*')
    console.log('测试b',b)
  },

运行效果截图
在这里插入图片描述
完成的测试程序如下:

const app = getApp()

Page({
  data: {
  },
  yihuohe1:function(char){
    var that=this;
    let string=char
    let num_front=that.strToHexCharCode(string[1])//获取首位的10进制数
    for(let i=0;i<string.length;i++)
    {
     if(string[i]=='*'){
      for(let j=1;j<i-1;j++){//对于*前的assic进行转10进制,再做异或和
        num_front=num_front^((that.strToHexCharCode(string[j+1])))
      }
      if(((num_front).toString(16)).length==2){
        var b=(num_front).toString(16)
        var a=b.toUpperCase()

        return a
  }
      if(((num_front).toString(16)).length==1)
      {
        return ('0'+(num_front).toString(16)).toUpperCase()
      }
    }
  }
  },
  
  test:function(){
    let b=this.yihuohe1('$HC13,28.39478985,112.75924959,28.39478987,112.75924959,28.39478987,112.75924955,28.39478987,112.75924955*')
    console.log('测试b',b)
  
  },
  //====================================异或和结束===============================================
ab2hex:function(buffer){
  var hexArr =Array.prototype.map.call(
    new Uint16Array(buffer),
    function(bit){
      return ('00'+bit.toString(16).slice(-2))
    }
  )
  return hexArr.join('');
},
// 字符串转byte
stringToBytes(str) {
  var array = new Uint8Array(str.length);
  for (var i = 0, l = str.length; i < l; i++) {
    array[i] = str.charCodeAt(i);
  }
  console.log(array);
  return array.buffer;
},

ab2str:function(buf){
  return String.fromCharCode.apply(null, new Uint8Array(buf));
},
//ASCII码转16进制
strToHexCharCode:function(str) {
  if (str === "") {
      return "";
  } else {
      var hexCharCode = [];
      hexCharCode.push("0x");
      for (var i = 0; i < str.length; i++) {
          hexCharCode.push((str.charCodeAt(i)).toString(16));
      }
      return hexCharCode.join("");
  }
},
})

``
其中wxml处用一个按钮绑定bindtap是函数"test"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值