1.标识头,尾和转义方式
它和808不同,它的头和尾标识不一样,头是5b,尾是5d
转义方式:
5b->5a 01
5a->5a 02
5d->5e 01
5e->5e 02
2.校验码(CRC16-CCITT)
协议上面写校验码是CRC16-CCITT,我到现在还不会算CRC16-CCITT,然后我就去搜809协议的相关代码,看别人用的全都是CRC16-CCITT-FALSE,那我也用这个,大致原理如下:
生成多项式是x^16+x^12+x^5+1,也就是0x11021
和学校的学的crc8相似,但是false是初值是0xFFFF的,就是说刚开始crc寄存器里面存储的16位是FFFF,然后再进行循环计算。
具体代码网上一大堆,各种语言的都有。
网上的算法大多比较简单,他们直接不用第一个十六进制数,直接用1021,只要把要验证的数据第一位保证是1,然后再往后移一位即可。
(补)CRC16-CCITT
crc16-CCITT的代码终于实现了,不用翻转输入输出,直接翻转多项式的即可,具体代码如下:
// CCITT
function calculateCRC16CCITT(data) {
let crc = 0x0000;
for (let i = 0; i < data.length; i++) {
crc ^= data[i];
for (let j = 0; j < 8; j++) {
if (crc & 0x0001) {
crc = (crc >> 1) ^ 0x8408;
} else {
crc >>= 1;
}
}
}
return crc & 0xFFFF;
}
// const data = Buffer.from('Hello, World!', 'utf8');
const data = Buffer.from('11FF','hex')
const crc = calculateCRC16CCITT(data);
console.log(`CRC16-CCITT: ${crc.toString(16).toUpperCase()}`);
结果可以在CRC(循环冗余校验)在线计算_ip33.cCRC(循环冗余校验)在线计算_ip33.com上校验CRC(循环冗余校验)在线计算_ip33.c