OWI_ComputeCRC16返回值0

时间:2016-01-27 15:14:41

标签: crc crc16

我正在检查这个函数OWI_ComputeCRC16(),当我用OWI_ComputeCRC16(0>> 8,0)测试函数时,返回值为0.

/**
* @brief    Compute the CRC16 value of a data set.
* @details  This function will compute the CRC16 of inData using seed as inital value for the CRC.
* @note     Setting seed to 0 computes the crc16 of the inData.
* @note     Constantly passing the return value of this function as the seed argument computes the CRC16 value of a longer string of data.
* @bug      N/A
* @warning  N/A
* @param    unsigned char inData: One byte of data to compute CRC from.
* @param    unsigned short seed: The starting value of the CRC.
* @return   The CRC16 of inData with seed as initial value.
*/
unsigned short OWI_ComputeCRC16(unsigned char inData, unsigned short seed)
{
    unsigned char bitsLeft;
    unsigned char temp;

    for (bitsLeft = 8; bitsLeft > 0; bitsLeft--)
    {
        temp = ((seed ^ inData) & 0x01);
        if (temp == 0)
        {
            seed >>= 1;
        }
        else
        {
            seed ^= 0x4002;
            seed >>= 1;
            seed |= 0x8000;
        }
        inData >>= 1;
    }
    return seed;
}

这在我必须解决的遗留代码中出现了一些问题,其中此函数也与参数0,0一起使用,然后使用计算出的CRC值的SUM。

示例:

a)我有一些关于示例位置= 0的数据,其中key = 0 ... => OWI_ComputeCRC16(0>> 8,0)返回0.

b)我有一些关于示例位置= 0的数据,其中key = 0 ... crc = 0.并且我在示例位置= 1上有另一个数据记录,其中key = 1 ... OWI_ComputeCRC16(1>> 8,1)返回49345。

如果我对这个返回的CRC值进行SUM,我不知道是否包含来自位置0的数据。

好的,我认为这是一个逻辑错误,我可以解决它。

问题是:是否可以计算和返回CRC值,返回值0(对于任何可能的给定输入值)?

p.s:这是我关于stackoverflow的第一个问题,所以如果我做错了或不可理解,请告诉我。感谢。

1 个答案:

答案 0 :(得分:0)

  

问题是:功能是否正常,应该计算和   返回CRC值,返回值0(对于任何可能的给定输入   值)?

不适用于任何字节,但对于某些字节序列,您将获得零返回值。实际上对于16位CRC,您应该期望在您尝试的每65536个随机序列中平均得到一个CRC。

这个特殊的CRC,没有前置或后置调节,将为空序列和任何零序列提供零CRC。

顺便说一下,这是一个奇怪的实现,操作比需要的多得多。它应该被替换为:

unsigned short OWI_ComputeCRC16(unsigned char inData, unsigned short seed)
{
    seed ^= inData;
    for (int k = 0; k < 8; k++)
        seed = seed & 1 ? (seed >> 1) ^ 0xa001 : seed >> 1;
    return seed;
}

这也不会混淆CRC多项式,在这个版本中,熟悉的(反射的)0xa001或(未反射的)多项式0x8005,即x 16 + x 15 + X 2 1。 更快仍然是字节方式或逐字表驱动的版本。有关示例,请参阅crcany.c