Вычисление 16-битной контрольной суммы? - PullRequest
0 голосов
/ 25 октября 2018

Работа с программой на c, которая читает файл, а затем я должен выполнить для программы 8-битную и 16-битную контрольную сумму. У меня пока только 8-битная контрольная сумма.

Вот чтоЯ понимаю,

Я читаю файл и сохраняю информацию в виде массива символов, и в конце она принимает перевод новой строки.так, например, чтобы вычислить 8-битную контрольную сумму, это то, что происходит по существу

Файл имеет всего 3 буквы (3 символа и перевод строки)

, поэтому массив содержит 4 символа aaa + (перевод строки) (97+ 97 + 97 + 10)

Насколько я понимаю, я добавляю все байты в массив, затем делаю% 256, и это моя контрольная сумма.

97 * 3 = // 3 a (маленький a) извлечены из таблицы ascii из того, что я понимаю

291 + 10 = 301 // + новая строка

301% 256= cc в шестнадцатеричном виде //

однако я не понимаю, как рассчитать 16-битную контрольную сумму, потому что я не могу добавить 2 символа за раз, если это один массив символов?

anyпомощь будет принята с благодарностью

1 Ответ

0 голосов
/ 25 октября 2018

Чтобы вычислить 16-битную контрольную сумму, вы обрабатываете массив с шагом 2 и помещаете один байт в младший байт добавляемого значения, а другой байт в старший байт.

uint8_t array[MAX]; // The data gets copied into here
size_t length; // This is the length of the data
uint16_t checksum = 0;
size_t even_length = length - length%2; // Round down to multiple of 2
for (int i = 0; i < even_length; i += 2) {
    uint16_t val = array[i] + 256 * array[i+1];
    checksum += val;
}
if (i < length) { // Last byte if it's odd length
    checksum += array[i];
}

Нет необходимости использовать модуль, поскольку целые числа без знака автоматически реализуют модульную арифметику.

...