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

C中的XOR类型场景输出不正确,c,binary,compare,xor,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 其中,这两个字符串应为异或,并将生成一

基本上,我正在制作一个程序,在初始十六进制值上计算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");
}
,多项式是

1111 1101 1000 0000 0000 0000 0000 0000
binary2
是新的二进制字符串,应该通过XOR'd创建

我的问题是,每当我运行这个程序时,它在最后4位都是正确的,这使得它们都
1
s。所以我的输出是:

0101 0110 1001 0010 0100 0101 0000 1111
最后四位应该是0,直到多项式字符串被推到那个位置为止。我完全不知道为什么会发生这种事。有人能解释一下吗


编辑:根据需要编辑更多代码

二进制文件
启动为:

char binary[4*strlen(hex)];
其中hex是十六进制值的字符串
AB1245

下一位是用于创建多项式和将0位附加到
二进制
末尾的过程(CRC计算所需):

char多项式[10]=“111111011”;
//向二进制字符串追加必要的位数
int track=strlen(二进制);
strcat(二进制,“00000000”)//这是静态的,因为CRC-8中始终使用8个零
//为XOR步骤创建带尾部的多项式
字符尾[strlen(二进制)];
strcpy(尾部,“0”)//出于某种原因,如果我不这样做,它会吓坏的
对于(i=0;i

在这一点上,我可以通过在两者上打印
strlen()
的结果来验证它们的长度是否相同。它们都正确地显示为
32

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

首先,字符数组不会自动增长以适应放入其中的任何内容,并且必须调整大小以在整个文本后包含以null结尾的字节。所以二进制和多项式应该声明为
charbinary[33]或甚至超过33,这取决于可能的其他输入。如果希望它们“增长”,则需要使用
malloc
动态分配它们这很可能是您出现问题的原因,您的阵列中至少有一个溢出,可能有几个溢出。


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

binary
是3个字节,而循环的长度仅为24个字节。输出字符串应仅为24位,而不是32位。这些字符串是否以null结尾?数组的二进制和多项式大小是否相同?显示时应为32。我想要8个0。据我所知,被比较的两个字符串长度相同(32),以null结尾。我不知道您可以使用不可用的字符数组在C中创建字符串。您的问题表明您知道什么是XOR,但您的代码不知道,这使我相信您可能没有发布真正的代码。@user1067354您是否省略了二进制中最低有效字节?
char binary[4*strlen(hex)];
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);