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

标签 c algorithm crc

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

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

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

  3. 如果 crc(A)=acrc(B)=b ,我可以使用 a 和 b 找到 crc(AB) ?

  4. crc 有任何代数性质吗?

  5. 我在网上找到一个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/

相关文章:

algorithm - GPS 接收器如何将其 quartz 钟与 GPS 卫星同步?

algorithm - 公牛和奶牛 - 破解密码 - 算法

java - 获取字节数组的 CRC 校验和并将其添加到该字节数组

为 windows mobile 6 编译 zlib

c - 将内核添加到 Windows 启动菜单

algorithm - 变半径高斯模糊,逼近核

networking - CRC 突发错误检测校验和结果的证明

c++ - 无序多集的散列/crc 算法

c - 通过程序集以编程方式检测上下文切换

c - 在 visual studio 2005 中强制执行 C 风格注释