C输出中的XOR类型场景不正确

时间:2011-11-26 22:38:12

标签: c binary compare xor

基本上我正在制作一个在初始十六进制值上评估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

1 个答案:

答案 0 :(得分:1)

看起来你要在堆栈上分配字符串,其长度是根据以类似方式分配的其他字符串计算的。这提出了两个主要问题:

首先,char数组将自动增长以适应你放入它们的任何内容,并且它们的大小必须在整个文本之后包含一个空终止字节。因此二进制和多项式应声明为char binary[33];或甚至超过33,具体取决于其他输入是否可能。如果您希望它们“增长”,那么您需要使用malloc来动态分配它们。 这很可能是导致问题的原因,至少有一个甚至是几个阵列都在溢出。

其次,char数组必须初始化为空,默认情况下它们不是空的(它们包含“垃圾”),因此获取它们的长度或连接它们将产生意外的结果。