我正在检查这个函数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的第一个问题,所以如果我做错了或不可理解,请告诉我。感谢。
答案 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。