#c #checksum #data-integrity
#c #контрольная сумма #целостность данных
Вопрос:
Я просматривал некоторый код, который загружает данные в память, и в конце загрузки он выполняет некоторую проверку целостности данных. Проверка целостности считывает буфер порциями по 4 байта и добавляет их в накопитель, поворачивая накопитель вправо 1
между каждым добавлением. Если накопитель заканчивается на 0, данные в порядке.
Я знаю, что последние байты буфера не являются частью самих данных, что означает, что последние 4 байта являются «магическим числом» для переключения накопителя на 0. Я также знаю, что он использует фрагменты по 4 байта, поскольку по умолчанию используется 32-битный процессор. Прилагается воссоздание кода:
#define ROR32(i,c) ((i >> c)|(i << (32 - c)))
void check(uint32_t *buffer, uint32_t size) {
uint32_t i, ret = 0;
for (i=0; i < size/4 ; i ) {
ret = ROR32(ret, 1);
ret = buffer[i];
}
if (ret)
printf("Data corrupt (%d)n", ret);
else
printf("Data OK.n");
}
Я хотел узнать, является ли это стандартным алгоритмом целостности (у него есть имя?) и почему вращение битов? Я не нашел ничего подобного, поскольку ключевые слова поиска «контрольная сумма», «целостность», «ror» и «сумма» являются неопределенными для каких-либо значимых результатов.
Спасибо.
Комментарии:
1. Кажется, изменен с en.wikipedia.org/wiki/BSD_checksum ?
2. Вращение битов необходимо , простое добавление не заметит замены двух 32-битных значений. Я не знаю, ваша ли это работа, но, как написано сейчас, он будет учитывать только каждый 4-й 32-битный блок…
3. Антти Хаапала, я думал о контрольной сумме BSD (она появилась в результатах), но, как вы заявили, она несколько изменена, и я пытаюсь понять, является ли это стандартом. Спасибо за подсказку о повороте битов, теперь это имеет большой смысл. Реализация — моя ошибка (я прочитал ее с пробелами по ошибке). Спасибо.