如何用多项式除法(异或除法成列)的规则计算CRC32

问题描述 投票:0回答:1

在多项式除法算法中,将零写入寄存器的末尾以计算各种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;
} 
c crc crc32
1个回答
0
投票

你的常数

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
。瞧。

© www.soinside.com 2019 - 2024. All rights reserved.