取自IEEE 802.3,
在数学上,对应于给定MAC帧的CRC值由以下过程定义:
a)帧的前32位被补充 b)然后将受保护字段的n位视为 系数n - 1的多项式M(x)的系数。(第一位 目标地址字段的对应于x(n-1)项和最后一项 MAC客户端数据字段的位(或Pad字段,如果存在)对应于 x0术语。)
c)M(x)乘以x32并除以G(x),产生度数≤31的余数R(x)。 d)R(x)的系数被认为是32位序列 e)比特序列被补充,结果是CRC。
https://www.kernel.org/doc/Documentation/crc32.txt
以这种方式编写的大端CRC将编码如下:
for (i = 0; i < input_bits; i++) {
multiple = remainder & 0x80000000 ? CRCPOLY : 0;
remainder = (remainder << 1 | next_input_bit()) ^ multiple;
}
哪里是 c部分)M(x)乘以x ^ 32 ? 我没有看到任何数字附加32个零。
以下一段代码对我来说毫无意义。代码和数学并不匹配。
Evaluating the differences in CRC-32 implementations 和
unsigned short
crc16_update(unsigned short crc, unsigned char nextByte)
{
crc ^= nextByte;
for (int i = 0; i < 8; ++i) {
if (crc & 1)
crc = (crc >> 1) ^ 0xA001;
else
crc = (crc >> 1);
}
return crc;
}
这些实现在做什么?它们都不像原来的程序。
即使阅读完毕后仍然没有意义: http://www.relisoft.com/science/crcmath.html
答案 0 :(得分:1)
This tutorial(对于那些会抱怨链接腐烂的人来说,here,here和here,特别是&#34; 10。一个略微受管理的表驱动实现&#34;,很好地解释了优化,以避免在最后添加额外的32个零位。
最重要的是你将这些位输入到寄存器的末尾而不是开始,这与在末尾输入寄存器长度为零的效果相同。
本教程还很好地展示了您引用的实现如何实现GF(2)上的长除法。