循环冗余校验(crc)问题和属性?

时间:2014-07-01 07:54:38

标签: c algorithm crc

我对crc算法有一些疑问,在这种情况下是关于crc8的。

  1. 是crc标准吗?我的意思是,如果我告诉某人我在我的框架中使用crc8,我应该给他我的crc8代码还是他可以在网上找到它,因为它是标准的?

  2. 是crc可逆吗?这意味着,如果crc(x)=y x,我可以y找到crc(A)=a吗?

  3. 如果crc(B)=bcrc(AB),我可以使用a和b查找C吗?

  4. crc是否具有任何代数属性?

  5. 我在网上找到了C中的crc8代码,如何验证代码的正确性?我找到了一些在线计算器,但没有人对应我的代码,为什么? 这些是我使用的网站:
    Site: 1
    Site: 2
    这是我在char crc8(char arr[], char arrLen){ char crc=0; char i; char shift; for (i = 0; i < arrLen; i++){ crc ^= (arr[i]); for (shift = 8; shift > 0; shift--){ if (crc & 10000000) crc = (crc << 1) ^ 0x131; else crc = (crc << 1); } } return crc; } 中的crc8的代码:

  6. {{1}}

2 个答案:

答案 0 :(得分:4)

CRC通常用于验证一段数据(实际上是一个字节数组)。它计算对应于给定字节集(数据)的n位值,其中n是CRC-n中的数字(因此CRC-8为8位)。它就像一个哈希函数,但它不是一个安全的哈希,必须用于有限的目的,比如错误检查。

以下是您的一些问题的简单答案。

是crc标准吗?我的意思是,如果我告诉某人我在我的框架中使用crc8,我应该为他提供我的crc8代码,还是他可以在网上找到它,因为它是标准的?

CRC是标准的吗?是。 CRC-16和CRC-32是更常用的。 CRC-8,我不确定它的效率,因为它最多只能生成256个唯一值。

crc是可逆的吗?这意味着如果crc(x)= y,我可以找到x,如果我有y?

没有

如果crc(A)= a且crc(B)= b,我可以使用a和b来查找crc(AB)吗?

没有

crc是否具有任何代数属性?

你的意思是联想,交换等吗?它是一个哈希函数。同样的事情适用于CRC-8和MD5等。来自维基百科(http://en.wikipedia.org/wiki/Cyclic_redundancy_check#CRCs_and_data_integrity),CRC有这个属性:

CRC(x^y^z) == crc(x) ^ crc(y) ^ crc(z)

我在网上找到了一个用C语言编写的crc8代码,如何验证代码的正确性?

我尝试运行您发布的代码和另一个crc8代码:https://chromium.googlesource.com/chromiumos/platform/vboot_reference/+/d96b25d0c0a739d351b8f09b128782ca12b7b0e1/firmware/lib/crc8.c。两者似乎都为相同的多项式提供相同的输出(链接代码中的0x1310而不是0x1070)。关于与您比较的网站的输出进行比较,您可能需要考虑调整polynomial部分。如果我今天晚些时候有时间对其进行调查,我会在此更新。

<强>更新

CRC计算器http://depa.usst.edu.cn/chenjq/www2/software/crc/CRC_Javascript/CRCcalculation.htm采用8位多项式,并假设第9位始终置位。发布的代码中使用的多项式为0x131。如果将第9位清零,则它变为0x31。因此,如果在CRC计算器中使用31作为多项式,则会得到相同的答案。

同时将您发布的代码与CRC算法进行比较,看起来还不错。

希望有所帮助:)

答案 1 :(得分:2)

纠正@ bytefire的答案之一:

  

如果crc(A)= a且crc(B)= b,我可以用a和b来找到crc(AB)吗?

是的,如果你的长度也是A.你可以查看crc32_combine_()中的zlib,了解它是如何完成的。

使用最佳多项式查看this answer的CRC-8代码。