基本上,我正在制作一个程序,评估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其中这两个字符串应该是XOR'd,并将生成一个新的字符串。它应该是:
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 0000binary2是新的二进制字符串,应该从它们创建为XOR'd。
我的问题是,每当我运行这个程序,它是正确的,直到最后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网站上。
发布于 2011-11-26 23:51:02
看起来,您在堆栈上分配字符串的长度是从以类似方式分配的其他字符串中计算出来的。这就提出了两个主要问题:
首先,char数组不会自动增长以适应您在其中放置的任何内容,它们的大小必须在整个文本之后包含一个以空结尾的字节。因此,二进制和多项式应该声明为char binary[33];,甚至超过33,这取决于其他可能的输入。如果希望它们“增长”,则需要使用malloc动态分配它们。--这很可能是造成您的问题的原因,您至少已经溢出了一个,可能还有几个数组。
第二,char数组必须初始化为空,默认情况下它们不是空的(它们包含“垃圾”),因此取其长度或连接到它们将产生意想不到的结果。
https://stackoverflow.com/questions/8282168
复制相似问题