在多项式除法算法中,将零写入寄存器的末尾以计算各种CRC。这些零点的数量等于除数多项式的次数。但是,在CRC32C方法中,它包含了有效的RefIn和RefOut标志,这改变了计算算法。我试图将一些值分成一列并将其与在线 CRC 计算器进行比较,但我无法以任何方式获得类似的结果。你能用一些输入数据的例子来展示带列划分的 CRC32C 计算吗?
也可以使用位移法查看结果:
unsigned int CRC_32C(int symnum, char* maintext) {
unsigned int crc = 0xFFFFFFFF;
for (unsigned int i = 0; i < symnum; i++) {
unsigned int byte = maintext[i];
crc ^= byte;
for (int j = 0; j < 8; j++) {
crc = (crc >> 1) ^ ((crc & 1) ? 0x82F63B78 : 0);
};
}
crc ^= 0xFFFFFFFF;
return crc;
}
你的常数
0x82F63B78
是x32以下多项式系数的反映,所以它代表:
x32 + x28 + x27 + x26 + x25 + x23 + x22 + x20 + x19 + x18 + x14 + x13 + x11 + x10 + x9 + x8 + x6 + 1.
您可以在
这个 CRC 计算器网站上以
100011110110111000110111101000001
的形式输入该多项式,以查看分步完成的除法。
为了仅显示除法,我们要复制 for 循环的作用。我们将删除您例程中的前后处理,将
crc
初始化为零,并且最后不执行异或。然后根据 ASCII 字母“k”计算出的问题中的 CRC 给出0xf84f3859
。让我们通过部门来运行它。将该网页上的数据设置为“k”,0x6b
,reflected,即11010110
。结果是:
现在我们反映余数
10011010000111001111001000011111
得到0xf84f3859
。瞧。