首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C中生成的CRC查找表总是给出不同的结果

C中生成的CRC查找表总是给出不同的结果
EN

Stack Overflow用户
提问于 2017-10-05 03:42:17
回答 2查看 1.7K关注 0票数 0

我正在尝试创建一个函数来生成CRC查找表。我使用的是8051微控制器,我宁愿使用查表的方法,但同时,我宁愿让我的计算机生成值,然后直接加载到微控制器中。大部分源代码都是从:8c-source.html借来的。

我只添加了"main“函数

代码语言:javascript
运行
复制
#include <stdio.h>
#define GP  0x107
#define DI  0x07

static unsigned char crc8_table[256];
static int made_table=0;

static void init_crc8()
{
  int i,j;
  unsigned char crc;
  if (!made_table) {
    for (i=0; i<256; i++) {
      crc = i;
      for (j=0; j<8; j++)
        crc = (crc << 1) ^ ((crc & 0x80) ? DI : 0);
      crc8_table[i] = crc & 0xFF;
    }
    made_table=1;
  }
}

void crc8(unsigned char *crc, unsigned char m)
{
  if (!made_table)
    init_crc8();
  *crc = crc8_table[(*crc) ^ m];
  *crc &= 0xFF;
}

int main()
{
  unsigned char crc[1];
  crc8(crc,'S');
  printf("S=%x\n",crc[0]); //different hex code almost every time
  crc8(crc,'T');
  printf("T=%x\n",crc[0]); //different hex code almost every time
  return 0;
}

当我执行程序时,我期望屏幕上有相同的值,但是在打印后的十六进制代码在几乎每一个程序执行时都会改变符号。

我能做些什么来纠正这个问题?我不想收集不正确的CRC值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-05 05:21:58

总的来说,儿童权利委员会尚未初始化。因此,在crc8中,表达式( *crc ) ^ m中的*crc未初始化,因此您的随机值。

修正:初始化crc。有点像

代码语言:javascript
运行
复制
unsigned char crc[1] = { 0 };
票数 0
EN

Stack Overflow用户

发布于 2017-10-05 05:31:07

  1. crc[0]未初始化。在用crc[0] = 0;调用crc8()之前,需要crccrc。然后,您将不会从crc[0]的随机初始内容中得到随机的答案。
  2. 您不需要*crc &= 0xff; in crc8()。如果char是八位,那么它什么也不做。如果您有一个奇怪的体系结构,其中char超过8位,那么您需要执行*crc = crc8_table[((*crc) ^ m) & 0xff];以确保不会超出表的范围。(在CRC计算中将只使用低8位的m。)表的内容已经被限制为8位,所以在任何情况下都不需要最终的& 0xff
  3. 你可能需要一个不同于零的初始值,你可能需要排他性的--或最终的CRC值--这取决于你想要的CRC-8的定义。在CRC的RevEng目录中,有两个具有该多项式的8位CRC没有被反射.这两种方法都是以初始值为零开始的,但其中一种是独占的,最后是0x55。另外,您需要的CRC定义可能会被反映出来,在这种情况下,移位方向会发生变化,多项式也会被翻转。如果您的CRC-8需要与其他软件互操作,那么您需要找出所使用的CRC的完整定义。
  4. 在这里传递指针似乎是一个奇怪的选择。直接传递和返回CRC值将更有效。例如,unsigned crc8(unsigned crc, unsigned ch) {,它将ch中的八位应用于CRC crc,并返回新的值。请注意,您不需要将CRC值设置为charunsigned通常是C例程最有效地将其作为参数并返回的内容。实际上,第一个参数通常在寄存器中传递,并在同一个寄存器中返回。
  5. 通常,在由一系列字节组成的消息上计算CRC。使用循环执行整个消息的例程会更有效,这样您就不需要检查是否已经为消息的每个字节构建了表。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46577498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档