我有一个串行通信协议,但在查找已使用的校验和算法方面遇到了一些麻烦。我尝试了几个CRC16 algorithms
,但似乎都没有。
消息看起来像这样(十六进制):
55 13 04 03 09 f1 01 00 00 06 50 08 00 02 00 00 00 cc 1a
55 13 04 03 09 f1 01 00 00 06 50 00 00 02 00 00 00 94 3b
55 13 04 03 09 f1 02 00 00 06 50 08 00 02 00 00 00 7f e4
55 13 04 03 09 f1 02 00 00 06 50 00 00 02 00 00 00 27 c5
55 13 04 03 09 f1 03 00 00 06 50 08 00 02 00 00 00 ee b1
55 13 04 03 09 f1 03 00 00 06 50 00 00 02 00 00 00 b6 90
我知道起始字节是0x55
,第二个字节是消息长度
如有必要,我可以提供更多数据。任何帮助或提示将不胜感激;)
致以最诚挚的问候,Amir
答案 0 :(得分:0)
取决于计算CRC的字节数。
您可以使用RevEng尝试从示例中提取CRC参数。从您的示例中可以清楚地看出,这是一个带有多项式0x1021
的16位CRC,并且CRC被反射(当应用于输入时,多项式位反转,并且CRC寄存器右移,没有离开)。但是,初始值和最终异或 - 取决于计算CRC的字节数。要真正解决这些问题,你还需要不同长度的示例消息。
RevEng catalog of 16-bit CRCs有几个标准的CRC可能是:
width=16 poly=0x1021 init=0xffff refin=true refout=true xorout=0x0000 check=0x6f91 name="CRC-16/MCRF4XX"
width=16 poly=0x1021 init=0xb2aa refin=true refout=true xorout=0x0000 check=0x63d0 name="CRC-16/RIELLO"
width=16 poly=0x1021 init=0x89ec refin=true refout=true xorout=0x0000 check=0x26b1 name="CRC-16/TMS37157"
width=16 poly=0x1021 init=0xc6c6 refin=true refout=true xorout=0x0000 check=0xbf05 name="CRC-A"
width=16 poly=0x1021 init=0x0000 refin=true refout=true xorout=0x0000 check=0x2189 name="KERMIT"
width=16 poly=0x1021 init=0xffff refin=true refout=true xorout=0xffff check=0x906e name="X-25"
我没有得到任何假设整个事情都是消息,也没有丢弃前一个或两个字节。
该列表中最常见的CRC是KERMIT(也称为CCITT CRC-16)和X-25。
答案 1 :(得分:0)
this CRC计算器将为您提供帮助。