我对crc算法有一些疑问,在这种情况下是关于crc8的。
是crc标准吗?我的意思是,如果我告诉某人我在我的框架中使用crc8,我应该给他我的crc8代码还是他可以在网上找到它,因为它是标准的?
是crc可逆吗?这意味着,如果crc(x)=y
x
,我可以y
找到crc(A)=a
吗?
如果crc(B)=b
和crc(AB)
,我可以使用a和b查找C
吗?
crc是否具有任何代数属性?
我在网上找到了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的代码:
{{1}}
答案 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代码。