分享
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。
这些天要写一个通信协议封解包程序,要用到CRC16校验,协议中关于CRC的资料如下图:

我参考了一下别人用Java写的CRC16函数
public static String getCrc(byte[] data) {
int high;
int flag;
int wcrc = 0xffff;
for (int i = 0; i < data.length; i++) {
high = wcrc >> 8;
wcrc = high ^ data[i];
for (int j = 0; j < 8; j++) {
flag = wcrc & 0x0001;
wcrc = wcrc >> 1;
if (flag == 1)
wcrc ^= 0xa001;
}
}
return Integer.toHexString(wcrc);
}
由于找不到golang现成的crc6相关的函数,它只有crc32的,然后用golang实现了一个:
func Crc16Verify(msg string) {
//16位全为1的寄存器
var crc uint16 = 0xFFFF
//高8位字节
var HighByte uint16
//移出的数位
var flag uint16
var msgBytes []byte = []byte(msg) //被校验的信息
var length int = len(msgBytes) //被校验的信息的长度
for i := 0; i < length; i++ {
HighByte = crc >> 8 // 16位寄存器的高位字节
crc = HighByte ^ uint16(msgBytes[i]) //取被校验串的一个字节与16位寄存器的高位字节进行异或运算
for j := 0; j < 8; j++ {
flag = crc & 0x0001 //移出的数位
crc = crc >> 1 // 把这个 16 寄存器向右移一位
if flag == 0x0001 { //移出位是1与多项式0xA001异或
crc ^= 0xA001
}
}
}
//crc = (crc << 8) ^ (crc >> 8)//高低字节对调
fmt.Printf("%#x\n", crc)
}
在Crc16Verify("1234")的时候,输出0x9181,同时Java版本的输出9181,但是用crc16校验工具算出的是1012和c613,没有一个对得上的。


小弟实在不知道错在哪里了,这个问题困扰了一天多,麻烦各位go大神指教指教!
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信5289 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传