C中生成的CRC查找表总是给出不同的结果
我正在尝试创建一个生成CRC查找表的函数。我使用的是8051微控制器,我更愿意使用查表法,但同时,我更愿意让我的计算机生成值,然后直接加载到微控制器中。大部分源代码都是从以下方面借用的: 我只在“main”函数中添加了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中,
#包括
#定义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
中的八位应用于CRCCRC
,并返回新值。请注意,不需要将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 };