我对 crc 算法有一些疑问,在这种情况下是关于 crc8 的。
crc 是标准的吗?我的意思是如果我告诉某人我在我的框架中使用 crc8,我应该给他我的 crc8 代码还是他可以在网上找到它,因为它是一个标准?
crc 是否可逆?这意味着如果
crc(x)=y
我可以找到x
如果我有y
吗?如果
crc(A)=a
和crc(B)=b
,我可以使用 a 和 b 找到crc(AB)
?crc 有任何代数性质吗?
我在网上找到一个
C
的crc8码,如何验证该码的正确性?我在网上找了一些计算器,但没有一个与我的代码对应,为什么? 这些是我使用的网站:
Site: 1
Site: 2
这是我在C
中的 crc8 代码:
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; }
最佳答案
CRC 通常用于验证一段数据(实际上是字节数组)。它计算对应于给定字节集(数据)的 n 位值,其中 n 是 CRC-n 中的数字(因此 CRC-8 为 8 位)。它类似于散列函数但它不是安全散列并且必须用于有限的目的,例如错误检查。
以下是对您的一些问题的简单回答。
crc 是标准的吗?我的意思是,如果我告诉某人我在我的框架中使用了 crc8,我应该给他我的 crc8 代码还是他可以在网上找到它,因为它是一个标准?
CRC 是标准的?是的。 CRC-16和CRC-32是比较常用的。 CRC-8,我不确定它的效率,因为它最多只能生成 256 个唯一值。
crc 是否可逆?这意味着如果 crc(x)=y 如果我有 y 我能找到 x 吗?
没有
如果 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 算法进行比较,看起来不错。
希望对您有所帮助:)
关于循环冗余校验 (crc) 问题和属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24505134/