0

我正在研究一个在其他人之间验证传入消息有效性的工作程序。使用的 CRC 是 CCITT 16,CRC 的初始值设置为 0xFFFF,并且消息以字节的形式发送,首先接收到的字节是 LSb 在前,字节在 MSB 在前。该消息形成一个长达 1024 位的长比特流,包括末尾的 16 个 CRC 位。

我完全理解CRC值的计算。令我感到困惑的是,我找不到任何证明它的参考资料,是在收到所有消息后执行的有效性检查。即,根据 0xF0B8 而不是 0x0000 检查 CRC 值。我错过了什么吗?

// crcValue is the 16 bit CRC variable under construction
// dataBit is a byte containing one bit of the data bitstream at LSb

...

// CRC calculation bit by bit

if(dataBit ^ (crcValue & 0x0001)) crcValue = (crcValue >> 1) ^ 0x8408;
else                              crcValue >>=1;
          
//After running over all the bitstream the crcValue is checked 

if(crcValue != 0xF0B8) ... // reject data  
else ...  // accept data

该程序有效。如前所述,我无法理解 0xF0B8 值的来源。

先感谢您

4

1 回答 1

1

您忽略了在附加到消息之前也会反转 CRC 的事实。0x0000如果没有最终反转或其他最终异或,则检查将起作用。0xf08b是两个零字节的 CRC(用 初始化0xffff,但不反转结果),这是在空消息的情况下附加的 CRC。

于 2021-10-12T04:05:53.027 回答