校验和计算

时间:2009-05-11 09:59:47

标签: c++ reverse-engineering checksum crc

为了计算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); }

请任何机构解释并告诉我逻辑。

4 个答案:

答案 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 pageHow Stuff Works

答案 2 :(得分:3)

关于CRC的一篇着名文章是罗斯威廉姆斯"A Painless Guide to CRC Error Detection Algorithms"。吸收需要一些时间,但它非常彻底。

答案 3 :(得分:1)