代码之家  ›  专栏  ›  技术社区  ›  Artiomik

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

  •  0
  • Artiomik  · 技术社区  · 3 年前

    在多项式除法算法中,0被写入寄存器的末尾,以计算各种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;
    } 
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   Mark Adler    3 年前

    你的常数 0x82F63B78 是x以下多项式系数的反映 32 ,因此它表示: x 32 +x 28 +x 27 +x 26 +x 25 +x 23 +x 22 +x 20 +x 19 +x 18 +x 14 +x 13 +x 11 +x 10 +x 9 +x 8. +x 6. +1。

    您可以将该多项式输入为 100011110110111000110111101000001 在…上 this CRC calculator website 逐步完成分工。

    为了只显示除法,我们想复制for循环的作用。我们将删除例程中的前处理和后处理,初始化 crc 到零,而不是做一个排他或在最后。然后,您的问题中基于ASCII字母“k”计算的CRC给出 0xf84f3859 。让我们把它贯穿整个部门。将该网页上的数据设置为“k”, 0x6b ,反射,即 11010110 。结果是:

    enter image description here

    现在我们反映结果的余数 10011010000111001111001000011111 得到 0xf84f3859 .瞧。

    您也可以使用all one的初始值进行除法运算( 0xffffffff )而不是全零。为此,将40位被除数的前32位反转。然后:

    1101011000000000000000000000000000000000
    

    变成

    0010100111111111111111111111111100000000
    

    进行划分(这是我自己的代码,其输出不如网站漂亮):

    10100111111111111111111111111100000000
    100011110110111000110111101000001
    --------------------------------------
      101000100100011100100001011100100000
      100011110110111000110111101000001
      ------------------------------------
        1011010010100100010110110100101000
        100011110110111000110111101000001
        ----------------------------------
          11101111001010011011001110101010
    
    quotient: 101010
    remainder: 11101111001010011011001110101010
    

    取余数,反映它,并反转它(最终的exclusive或),你得到 0xaa326b08