为了计算CRC,我发现了一段代码,但我不理解这个概念。 这是代码:
count =128 and ptr=some value;
calcrc(unsigned char *ptr, int count)
{
unsigned short crc;
unsigned char i;
crc = 0;
while (--count >= 0)
{
crc = crc ^ (unsigned short)*ptr++ << 8;
i = 8;
do
{
if (crc & 0x8000)
crc = crc << 1 ^ 0x1021;
else
crc = crc << 1;
} while(--i);
}
return (crc);
}
请任何机构解释并告诉我逻辑。
答案 0 :(得分:4)
这看起来像CRC(具体看起来像CRC-16-CCITT,用于802.15.4,X.25,V.41,CDMA,蓝牙,XMODEM,HDLC,PPP和IrDA等用途)。您可能希望阅读链接到维基百科页面上的CRC理论,以获得更多洞察力。或者你可以将其视为一个“黑盒子”,它只能解决计算校验和的问题。
答案 1 :(得分:3)
你可能需要知道在C中,^运算符是按位XOR operator和&lt;&lt;运算符是左移运算符(相当于乘以运算符右边的数字2的幂)。还有crc&amp; 0x8000表达式正在测试变量crc的最高位集。 这将帮助您对运行时发生的情况进行低级别说明,以便高度解释CRC的含义以及可能需要的原因,请阅读Wikipedia page或How Stuff Works。
答案 2 :(得分:3)
关于CRC的一篇着名文章是罗斯威廉姆斯"A Painless Guide to CRC Error Detection Algorithms"。吸收需要一些时间,但它非常彻底。
答案 3 :(得分:1)