我正在尝试创建一个函数来生成CRC查找表。我使用的是8051微控制器,我宁愿使用查表的方法,但同时,我宁愿让我的计算机生成值,然后直接加载到微控制器中。大部分源代码都是从: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值。
发布于 2017-10-05 05:21:58
总的来说,儿童权利委员会尚未初始化。因此,在crc8中,表达式( *crc ) ^ m中的*crc未初始化,因此您的随机值。
修正:初始化crc。有点像
unsigned char crc[1] = { 0 };
发布于 2017-10-05 05:31:07
crc[0]
未初始化。在用crc[0] = 0;
调用crc8()
之前,需要crc
或crc
。然后,您将不会从crc[0]
的随机初始内容中得到随机的答案。*crc &= 0xff;
in crc8()
。如果char
是八位,那么它什么也不做。如果您有一个奇怪的体系结构,其中char
超过8位,那么您需要执行*crc = crc8_table[((*crc) ^ m) & 0xff];
以确保不会超出表的范围。(在CRC计算中将只使用低8位的m
。)表的内容已经被限制为8位,所以在任何情况下都不需要最终的& 0xff
。0x55
。另外,您需要的CRC定义可能会被反映出来,在这种情况下,移位方向会发生变化,多项式也会被翻转。如果您的CRC-8需要与其他软件互操作,那么您需要找出所使用的CRC的完整定义。unsigned crc8(unsigned crc, unsigned ch) {
,它将ch
中的八位应用于CRC crc
,并返回新的值。请注意,您不需要将CRC值设置为char
。unsigned
通常是C例程最有效地将其作为参数并返回的内容。实际上,第一个参数通常在寄存器中传递,并在同一个寄存器中返回。https://stackoverflow.com/questions/46577498
复制相似问题