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

C中生成的CRC查找表总是给出不同的结果,c,memory,crc,lookup-tables,C,Memory,Crc,Lookup Tables,我正在尝试创建一个生成CRC查找表的函数。我使用的是8051微控制器,我更愿意使用查表法,但同时,我更愿意让我的计算机生成值,然后直接加载到微控制器中。大部分源代码都是从以下方面借用的: 我只在“main”函数中添加了 #包括 #定义GP 0x107 #定义DI 0x07 静态无符号字符crc8_表[256]; 静态整数表=0; 静态void init_crc8() { int i,j; 无符号字符crc; 如果(!制表){ 对于主体中的(i=0;i,crc[0]尚未初始化。因此,在crc8中,

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

我只在“main”函数中添加了

#包括
#定义GP 0x107
#定义DI 0x07
静态无符号字符crc8_表[256];
静态整数表=0;
静态void init_crc8()
{
int i,j;
无符号字符crc;
如果(!制表){

对于主体中的(i=0;i,crc[0]尚未初始化。因此,在crc8中,(*crc)^m表达式中的*crc未初始化,因此您的随机值

修复:初始化crc[0]。类似于

unsigned char crc[1] = { 0 };
  • crc[0]
    未初始化。在使用
    crc
    调用
    crc8()
    之前,您需要
    crc[0]=0;
    *crc=0;
    。这样您就不会从
    crc[0]
    的随机初始内容中得到随机答案
  • 您不需要
    crc8()
    中的
    *crc&=0xff;
    。如果
    char
    是八位的,那么它什么也不做。如果您有一个奇数架构,其中
    char
    超过八位,那么您需要执行
    *crc=crc8_table[(*crc)^m)&0xff];
    ,以确保您不会超出表的边界。(CRC计算中将只使用
    m
    的低位8位。)表的内容已被限制为8位,因此在任何情况下都不需要最终
    &0xff
  • 您可能需要一个不同于零的初始值,并且您可能需要将某个值与最终CRC值进行异或运算,这取决于您想要的CRC-8的定义。在中,有两个带有该多项式的8位CRC未被反射。两个CRC都恰好以初始值零开始,但一个CRC以
    0x进行异或运算55
    结尾。您需要的CRC定义也可能会反映出来,在这种情况下,移位方向会改变,多项式会翻转。如果您的CRC-8需要与其他软件互操作,那么您需要了解所使用的CRC的完整定义
  • 在这里传递指针似乎是一个奇怪的选择。直接传递并返回CRC值会更有效。例如
    无符号crc8(无符号CRC,无符号ch){
    ,将
    ch
    中的八位应用于CRC
    CRC
    ,并返回新值。请注意,不需要将CRC值设置为
    char
    无符号
    通常是C例程最有效地作为参数并返回的。事实上,通常第一个参数在寄存器中传递,然后返回在同一个寄存器中返回
  • 通常,对由一系列字节组成的消息计算CRC。如果有一个例程以循环方式处理整个消息,则效率更高,这样您就不需要检查是否已为消息的每个字节构建了表

  • 记住局部变量(包括数组)默认情况下是未初始化的。它们的值将是不确定的。现在在
    main
    函数中的
    crc
    数组的上下文中考虑这一点。在一个不相关的注释中,您可能应该了解操作符
    &
    @Somepro的地址:您是否可以更具体地了解
    &
    ?而不是使用数组to要能够传递指针,请使用简单的
    无符号字符crc;
    ,然后使用
    &crc
    获取指针。如
    crc8(&crc,'S'))
    。IMO的一个更好的解决方案是不模拟按引用传递,而是让
    crc8
    函数返回值。@Someprogrammerdude有人想回答吗?只是为了从未回答的问题列表中找出答案。这确实有效,但我尝试的无效方法是:
    crc[0]='\0';crc[1]='\0';
    因为它给了我一个分段错误。我对你的解决方案为什么有效感到困惑,但它显然有效。
    crc[1]='\0';
    unsigned char crc[1]={0};
    不同。前者是越界访问,因为它试图设置
    crc[]的第二个元素
    ,但由于第二个元素是用一个元素声明的,因此没有第二个元素。这样的访问应该会导致分段错误。后者是用一个值初始化一个单元素数组,将
    crc[0]
    设置为零。
    unsigned char crc[1] = { 0 };