1

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

4 回答 4

4

这看起来像CRC(具体来说,它看起来像 CRC-16-CCITT,被 802.15.4、X.25、V.41、CDMA、蓝牙、XMODEM、HDLC、PPP 和 IrDA 等使用)。您可能想阅读链接到 Wikipedia 页面上的 CRC 理论,以获得更多见解。或者您可以将其视为一个“黑匣子”,它只是解决了计算校验和的问题。

于 2009-05-11T11:09:36.753 回答
3

您可能需要知道,在 C 中,^ 运算符是按位异或运算符,<< 运算符是左移运算符(相当于乘以 2 到运算符右侧数字的幂)。crc & 0x8000 表达式也在测试变量 crc 的最高有效位集。这将帮助您对运行时发生的情况进行低级解释,对于 CRC 是什么以及您可能需要它的原因的高级解释,请阅读Wikipedia 页面How Stuff Works

于 2009-05-11T11:38:58.373 回答
3

一篇关于 CRC 的著名著作是Ross Williams 的“A Painless Guide to CRC Error Detection Algorithms”。它需要一些时间来吸收,但它非常彻底。

于 2009-05-11T11:53:24.540 回答
1

看看我对我 如何猜测校验和算法的回答?

于 2009-11-12T13:47:09.360 回答