【发布时间】:2012-05-31 05:50:41
【问题描述】:
我有一个设备,它向我发送带有 CRC 计算的数据。 每 16 个字节有 2 个 CRC 字节。 生成多项式为 x16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2 + 1
我的代码如下所示:
int crc16(unsigned char *addr, int num, int crc)
{
uint16_t poly = 0x3D65;
int i;
for (; num > 0; num--) /* Step through bytes in memory */
{
crc = crc ^ ((unsigned short)*addr++ << 8); /* Fetch byte from memory, XOR into CRC top byte*/
for (i = 0; i < 8; i++) /* Prepare to rotate 8 bits */
{
if (crc & 0x10000) /* b15 is set... */
crc = (crc << 1) ^ poly; /* rotate and XOR with XMODEM polynomic */
else /* b15 is clear... */
crc <<= 1; /* just rotate */
} /* Loop for 8 bits */
crc &= 0xFFFF; /* Ensure CRC remains 16-bit value */
} /* Loop until num=0 */
return(crc); /* Return updated CRC */
}
我还用其他多项式(如 0x9CB2)尝试了这段代码。我认为代码中存在错误。
【问题讨论】:
-
而你的问题是......究竟是什么?
-
您能否详细说明这个问题?告诉我们问题出在哪里……
-
好的,所以你认为代码中有错误。但你为什么这么认为?究竟是什么不起作用?你得到了哪些不正确的结果?
-
除了多项式之外,设备的文档如何描述 CRC? CRC 位可以按任意顺序存储,可以有一个不同于零的初始值,并且可以有前置和/或后置条件。你应该阅读ross.net/crc/download/crc_v3.txt。
-
您能否提供一个 16 字节数据和来自设备的 2 字节 crc 的示例?