java crc16-ccit_微信小程序-蓝牙设备需要CRC16-CCIT的鸡儿操作

博客介绍了CRC16-CCITT算法在微信小程序蓝牙设备中的使用,讨论了不同标准下的差异,如CRC16_CCITT、CRC16_XMODEM等,并提供了一段JavaScript实现的CRC校验代码,用于解决实际遇到的校验问题。
摘要由CSDN通过智能技术生成

CRC16 多项式为x16+x12+x5+1(0x1021),被用在各个规范中,其算法原理基本一致,就是在数据的输入和输出有所差异,下边把这些标准的差异列出,并给出小程序的算法实现。

CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结果与0x0000异或

CRC16_CCITT_FALSE:多项式x16+x12+x5+1(0x1021),初始值0xFFFF,低位在后,高位在前,结果与0x0000异或

CRC16_XMODEM:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在后,高位在前,结果与0x0000异或

CRC16_X25:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结果与0xFFFF异或

我这边的文档有点瓜皮,CRC校验算法是用CRC16_CCITT的,但是他的输出对不上,噗!!!心态都被搞蹦了,直接素质三连。

怎么算都不对,然后CRC16_XMODEM算出来的对的上,输出是反向的,再次确认,却还是说CRC16_CCITT,素质三连,最后也懒得跟他BB直接用CRC16_XMODEM,按低位在前,高位在后计算,校验就对的上了,真的是不安常理出牌,裂开!。

Let the code speak!

//CRC蓝牙校验

var crc16 = function (buffer) {

var crc = 0x0000;

var odd;

for(var i = 0; i < buffer.length; i++) {

crc ^= (buffer[i] << 8)

for(var j = 0; j < 8; j++) {

odd = crc & 0x8000;

crc = crc << 1;

if(odd) {

crc = crc ^ 0x1021

}

}

}

var hi = ((crc & 0xFF00) >> 8); //高位置

var lo = (crc & 0x00FF); //低位置

var crcArr = []

crcArr.push(hi)

crcArr.push(lo)

crc &= 0xFFFF

return crcToString(crcArr, true)

};

//转为大写String

function crcToString(arr, isReverse) {

if(typeof isReverse == 'undefined') {

isReverse = true;

}

var hi = arr[0],

lo = arr[1];

return CRC.padLeft((isReverse ? hi + lo * 0x100 : hi * 0x100 + lo).toString(16).toUpperCase(), 4, '0');

};

var padLeft = function (s, w, pc) {

if (pc == undefined) {

pc = '0';

}

for (var i = 0, c = w - s.length; i < c; i++) {

s = pc + s;

}

return s;

};

//十六进制字符串转字节数组

function HexString2Bytes(str) {

var pos = 0;

var len = str.length;

if (len % 2 != 0) {

return null;

}

len /= 2;

var arrBytes = new Array();

for (var i = 0; i < len; i++) {

var s = str.substr(pos, 2);

var v = parseInt(s, 16);

arrBytes.push(v);

pos += 2;

}

return arrBytes;

}

实例:

const byteData= util.hexString2Bytes("20200616")

let crc = util.crc16(byteData)

console.log("CRC转换:",crc)

结果:D969

个人结论:

其实CRC16 多项式为x16+x12+x5+1(0x1021)的算法都差不多,只是初始值,高低位和结果异或有所不同。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值