[我在CRC-16中有大量数据和相关的校验和,但我找不到正确的方法来计算此数据的校验和,并且与已有的CRC相同。
这是我的数据:
01 EF F7 FE EF FF FD EF FB FA FD A2 AA 21
与此数据关联的计算出的CRC-16:
01 F4
以及用于计算的多项式值:
84 08
然而,尽管我做了所有尝试,但我仍然找不到从我发布的数据计算上述校验和(01F4)的方法。
假设CRC右移,您可以通过将初始crc值更改为0x9786来强制匹配,但没有其他示例,目前尚不清楚这是否是正确的解决方案。示例代码,基于我在系统上搜索CRC初始值时使用的旧代码:
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
uint16_t crctbl[256];
void gentblr()
{
uint16_t crc;
uint16_t b;
uint16_t c;
uint16_t i;
for(c = 0; c < 0x100; c++){
crc = c;
for(i = 0; i < 8; i++){
b = crc&1;
crc >>= 1;
crc ^= (0-b)&0x8408; /* assumes two's complment math */
}
crctbl[c] = crc;
}
}
uint16_t crc16r(uint16_t crc, uint8_t * bfr, size_t size)
{
while(size--)
crc = (crc >> 8) ^ crctbl[(crc & 0xff)^*bfr++];
return crc ;
}
int main()
{
uint8_t data[]= {0x01,0xEF,0xF7,0xFE,0xEF,0xFF,0xFD,0xEF,0xFB,0xFA,0xFD,0xA2,0xAA,0x21};
uint16_t crcin, crc;
gentblr();
crcin = 0;
do {
crc = crc16r(crcin, data, sizeof(data));
if (crc == 0x01f4)
break;
} while (0 != ++crcin);
printf("%04x\n", crcin);
return 0;
}
输出是
0x9786