基本上我正在制作一个在初始十六进制值上评估CRC的程序。在这种情况下:
Hex = AB1245
我已在程序中将其转换为二进制文件:
1010 1011 0001 0010 0100 0101
这是具有给定多项式的CRC-8:
1 1111 1011
到目前为止,我已使用此信息创建以下设置:
1010 1011 0001 0010 0100 0101 0000 0000
1111 1101 1000 0000 0000 0000 0000 0000
这两个字符串应该是异或的,并且会生成一个新的字符串。它应该是:
0101 0110 1001 0010 0100 0101 0000 0000
我的代码是这样的:
for(i = 0; i < strlen(binary); i++) {
if (binary[i] == polynomial[i])
strcat(binary2, "0");
else
strcat(binary2, "1");
}
二进制文件
1010 1011 0001 0010 0100 0101
,多项式是
1111 1101 1000 0000 0000 0000 0000 0000
和binary2
是新的二进制字符串,应该从它们被创建为异或。
我的问题是每当我运行这个程序时,它都是正确的,直到最后4位,它无缘无故地使它们全部1
。所以我的输出是:
0101 0110 1001 0010 0100 0101 0000 1111
最后四位应为0,直到多项式字符串被推到那么远。我完全不知道为什么会这样。任何人都能解释一下吗?
编辑:根据要求提供更多代码。
binary
启动为:
char binary[4*strlen(hex)];
其中,十六进制是十六进制值AB1245
下一位是用于创建多项式并将0位附加到binary
末尾的过程(CRC计算所需):
char polynomial[10] = "111111011";
// Append the necessary number of bits to the binary string
int track = strlen(binary);
strcat(binary, "00000000"); //This is static as 8 zeroes are always used in CRC-8
// Create the polynomial w/ tail for the XOR steps
char tail[strlen(binary)];
strcpy(tail, "0"); //For some reason if I don't do this it freaks out
for (i=0; i < strlen(binary)-strlen(polynomial); i++)
strcat(tail, "0");
strcat(polynomial, tail);
此时我可以通过在两者上打印strlen()
的结果来验证它们的长度是否相同。它们都正确地出现在32
。
答案 0 :(得分:1)
看起来你要在堆栈上分配字符串,其长度是根据以类似方式分配的其他字符串计算的。这提出了两个主要问题:
首先,char数组将不自动增长以适应你放入它们的任何内容,并且它们的大小必须在整个文本之后包含一个空终止字节。因此二进制和多项式应声明为char binary[33];
或甚至超过33,具体取决于其他输入是否可能。如果您希望它们“增长”,那么您需要使用malloc
来动态分配它们。 这很可能是导致问题的原因,至少有一个甚至是几个阵列都在溢出。
其次,char数组必须初始化为空,默认情况下它们不是空的(它们包含“垃圾”),因此获取它们的长度或连接它们将产生意外的结果。