gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:54:40 25 4
gpt4 key购买 nike

我正在尝试创建一个生成 CRC 查找表的函数。我正在使用 8051 微 Controller ,我宁愿使用表查找方法,但同时,我宁愿让我的计算机生成值,然后我可以将其直接加载到微 Controller 中。此源代码大部分借自:http://www.rajivchakravorty.com/source-code/uncertainty/multimedia-sim/html/crc8_8c-source.html

我只在“main”函数中添加

#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 值。

最佳答案

  1. crc[0] 未初始化。在使用 crc 调用 crc8() 之前,您需要 crc[0] = 0;*crc = 0; 。那么您将不会从 crc[0] 的随机初始内容中获得随机答案。
  2. 您不需要 crc8() 中的 *crc &= 0xff;。如果char是八位,那么它什么也不做。如果您有一个奇怪的架构,其中 char 超过八位,那么您需要执行 *crc = crc8_table[((*crc) ^ m) & 0xff];<​​以确保您不会超出表格范围。 (只有m的低八位将用于CRC计算。)表的内容已经被限制为八位,所以无论如何你都不需要最终的& 0xff.
  3. 您可能需要一个不同于零的初始值,并且您可能需要将最终的 CRC 值与某些值进行异或运算,具体取决于您想要的 CRC-8 的定义。在 RevEng catalog of CRC's ,有两个带有该多项式的 8 位 CRC 未被反射(reflect)。两者都以初始值 0 开始,但其中一个在末尾与 0x55 进行异或运算。此外,您需要的 CRC 定义也可能会反射(reflect)出来,在这种情况下,移位方向会发生变化并且多项式会被翻转。如果您的 CRC-8 需要与其他软件互操作,那么您需要找出所使用的 CRC 的完整定义。
  4. 在这里传递指针似乎是一个奇怪的选择。直接传递并返回 CRC 值会更高效。例如。 unsigned crc8(unsigned crc, unsigned ch) {,它将 ch 中的八位应用于 CRC crc,并返回新值。请注意,您不需要将 CRC 值设置为 charunsigned 通常是 C 例程最有效地作为参数并返回的内容。事实上,通常第一个参数在寄存器中传递并在同一个寄存器中返回。
  5. 通常对由一系列字节组成的消息计算 CRC。如果有一个例程通过循环处理整个消息会更有效,这样您就不需要检查是否已为消息的每个字节构建了表。

关于用 C 生成的 CRC 查找表总是给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46577498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com