前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【投稿专区】crc校验码的计算

【投稿专区】crc校验码的计算

作者头像
李海彬
发布2018-03-26 14:18:51
3.9K0
发布2018-03-26 14:18:51
举报
文章被收录于专栏:Golang语言社区

在Modbus或环保212协议中,数据的校检码(CRC-16)由两个字节16位构成。而一般电气、自动化仪表的crc16校验,多项式码选用16进制A001。

CRC的计算方式如下:

在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB移位后已经被移出CRC寄存器)如果为,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位,所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。

Go 语言实现如下:

代码语言:javascript
复制
// 传入数据内容,返回 crc校验码
func Crc16Check(data []byte) []byte {
       var crc16 uint16 = 0xFFFF
       l := len(data)
       for i := 0; i < l; i++ {
              crc16 ^= uint16(data[i])
              for j := 0; j < 8; j++ {
                     if crc16&0x0001 > 0 {
                            crc16 = (crc16 >> 1) ^ 0xA001
                     } else {
                            crc16 >>= 1
                     }
              }
       }
       packet := make([]byte, 2)
       packet[1] = byte(crc16 & 0xff)
       packet[0] = byte(crc16 >> 8)
       return packet
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-04-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档