В основном я делаю программу, которая оценивает 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'ами, и будет создана новая строка. Должно быть:
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
- это новая двоичная строка, которая должна быть создана из них, будучи XOR'd.
Моя проблема заключается в том, что всякий раз, когда я запускаю эту программу, она корректна до последних 4 бит, где она делает их все 1
с без причины. Итак, мой вывод:
0101 0110 1001 0010 0100 0101 0000 1111
Последние четыре бита должны быть 0 до тех пор, пока полиномиальная строка не будет вытолкнута так далеко. У меня совершенно нет идей относительно того, почему это происходит. Кто-нибудь может пролить свет?
РЕДАКТИРОВАТЬ: Больше кода в соответствии с просьбой.
binary
инициируется как:
char binary[4*strlen(hex)];
где 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
.