Сценарий типа XOR в C выводит неправильно - PullRequest
0 голосов
/ 27 ноября 2011

В основном я делаю программу, которая оценивает 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.

1 Ответ

1 голос
/ 27 ноября 2011

Похоже, что вы размещаете свои строки в стеке с длинами, рассчитанными из других строк, распределенных аналогичным образом.Это создает две основные проблемы:

Во-первых, массивы символов не автоматически увеличиваются в соответствии с тем, что вы в них вставляете, и их размер должен включать нулевой завершающий байт после всего текста.Таким образом, двоичный и полиномиальный значения должны быть объявлены как char binary[33]; или даже больше 33 в зависимости от того, какие другие входные значения возможны.Если вы хотите, чтобы они «росли», вам нужно будет использовать malloc для их динамического распределения. Это, скорее всего, причина ваших проблем, вы переполняете хотя бы один и, возможно, несколько ваших массивов.

Во-вторых, массивы char должны быть инициализированы, чтобы быть пустыми, они не являютсяпо умолчанию пусто (они содержат «мусор»), поэтому их длина или конкатенация к ним приведут к неожиданным результатам.

...