计算poly CRC-32K / 6.2的CRC查找表

时间:2018-12-02 18:04:16

标签: c crc

我需要CRC Zoo中的poly (0x992c1a4c; 0x132583499) <=> (0x992c1a4c; 0x132583499)的属性。

我已经仔细阅读了WikipediaRoss N. Williams,但无法建立最终联系。而且我也不知道如何检查生成的表的正确性。

我是否需要考虑实施该系统的系统的字节顺序?是否可以使用反射算法?我应该选择哪个初始值和XorOut值?如何检查结果?

1 个答案:

答案 0 :(得分:2)

琐事-多项式0x132583499是3个素数(无进位乘法)的乘积:

0x3 * 0x3 * 0x5A12A42D = 0x132583499
  

compute-crc-lookup-table

这取决于crc是左移还是右移。假设该表一次只能处理一个字节,则使用256 x 32位表。对于左移crc,最重要的位被屏蔽:0x132583499-> 0x32583499:

void gentbl(void)
{
uint32_t crc;
uint32_t b;
uint32_t c;
uint32_t i;
    for(c = 0; c < 0x100; c++){
        crc = c<<24;
        for(i = 0; i < 8; i++){
            b = crc>>31;
            crc <<= 1;
            crc ^= (0 - b) & 0x32583499;
        }
        crctbl[c] = crc;
    }
}

对于向右移位的crc,多项式取反并向右移1位:(0x132583499取反= 0x132583499,向右移1位= 0x992c1a4c。

void gentbl(void)
{
uint32_t crc;
uint32_t b;
uint32_t c;
uint32_t i;
    for(c = 0; c < 0x100; c++){
        crc = c;
        for(i = 0; i < 8; i++){
            b = crc&1;
            crc >>= 1;
            crc ^= (0 - b) & 0x992c1a4c;
        }
        crctbl[c] = crc;
    }
}

  

我是否需要考虑实施该系统的系统的字节顺序?

仅当代码一次加载或存储一个字节以上时。如果符号大小与字节不同,则可能需要这样做。

  

我可以使用反射算法而不考虑字节序吗?

是的,字节序仅影响数据的加载和存储。反射算法用于右移crc,非反射用于左移crc。

  

我应该选择哪个初始值和XorOut值?

这是任意的,并取决于特定的crc。初始值通常是全零位或全一位,只有少数例外。 XorOut通常是0,但有时所有要发布的位都补全crc。

  

如何检查结果?

使用与在线计算器使用的某些crc具有相同的初始,异或和多项式的代码来验证某些crc值。请注意,字节顺序会影响某些在线计算器上显示的输出。在线计算器的字符串大小是有限的,但即使是几个字节也足以检查crc。如果该表是使用与上述示例类似的代码创建的,则不太可能混用好坏条目。


32位crc是通过将消息视为长的n位除数并将其除以33位多项式而产生的余数,结果是32位余数,即crc。其余部分将附加到消息中,从而生成n + 32位的编码字符串,该字符串是crc多项式的精确倍数。如果没有错误,并且为n + 32位编码的位字符串生成了crc,则crc将始终为某个常数,例如,如果xorout == 0,则为0。


crc动物园表包含其他信息,例如最大数据位数(附加32位crc之前)与汉明距离(HD)的列表,以HD = 3开头,这意味着每个有效的编码字符串与任何其他有效编码的字符串至少相差3位,因此,如果消息长度不太长,则可以检测到任何2位错误。您可以单击长度以查看扩展列表,其中包括故障示例,其中显示了前导位的索引以及消息的后32位(有些令人困惑,我将其中的一些转换为全部显示为索引)。显示了12种长度,我添加了第三行,显示了包括32位crc在内的长度:

HD = {    3,    4,    5,    6,  7,  8, 9,10,11,12,13,14
     {65506,65506,32738,32738,134,134,26,26,16,16, 3, 3}
     {65538,65538,32770,32770,166,166,58,58,48,48,35,35} +32 for crc

网站上包含当消息长度对于给定的汉明距离太长时crc poly为0x132583499的失败示例。对于HD = 3或4,具有长度(65538 + 1)65539位的编码消息,除了bit [0]和bit [65538] = 1外,所有零位都将通过crc检查,即使有2位错误。对于HD = 5或6,编码消息长度32771,除bit [{0,1,32769,32770}] = 1外,所有零位都通过crc检查,并出现4位错误。对于HD = 7或8,编码消息长度167,除bit [{0,43,44,122,123,166,166}] = 1之外的所有零位都通过crc检查,错误为6位。对于HD = 9或10(编码的消息长度为59),除bit [{0,5,21,25,33,37,53,58}] = 1之外的所有零位都通过crc检查,错误为8位。