809协议解读遇到的一些小问题

文章介绍了CRC16-CCITT校验码的计算方法,包括协议中的头尾标识(5b和5d)、转义规则以及CRC16-CCITT-FALSE的计算过程。提供了一个JavaScript函数来实现CRC16-CCITT校验,并给出了使用示例。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值