В настоящее время я пытаюсь отформатировать диск exFAT с помощью микроконтроллера. Моя проблема в том, что мне нужно вычислить контрольную сумму, которая использует байты из сектора 1-11 VBR (регион загрузки томов), чтобы сохранить его в секторе 12, но мой результат неверен. Когда контрольная сумма неверна, диск не может использоваться Windows или любой другой ОС, которая распознает exFAT, поскольку контрольная сумма проверена и возникает фатальная ошибка, если она неверна.Расчет контрольной суммы exFAT
Вот функция, которая вычисляет 32-битную контрольную сумму:
uint32_t BootChecksum(char * data, long bytes){
uint32_t checksum = 0;
for (uint32_t i = 0 ; i < bytes ; i++){
if (i == 106 || i == 107 || i == 112)
continue;
checksum = ((checksum << 31) | (checksum >> 1)) + (uint32_t) data[i];
if(checksum == 0xF1924082){
printf("%02X | i = %d", checksum, i);
}
}
return checksum;
}
Из того, что я был в состоянии читать, то функция является правильным, так я думаю, что данные, которые я использую неверны. Я просто беру 11 секторов, необходимых для 512 байтов на сектор, в результате получается массив из 5632 байт.
Я использовал аналогичную функцию для вычисления контрольной суммы набора записей (16-разрядная контрольная сумма), и результат верен, это действительно должны быть данные, но я не понимаю, что мне там не хватает !
Любой, кто знает об exFAT, может мне помочь? Благодаря!
Вы действительно правы, я попытался с вашей скобкой nd без круглых скобок, и я получаю одинаковый результат для обоих, поэтому кажется, что я неверно истолковал приоритет оператора! Но все же результат неверен. Я получаю 0x95672D57, тогда как у меня должно быть 0xF1924082. Спасибо за вашу помощь! –
@ArthurPenguin - решена проблема, посмотрим, сможем ли мы решить другую; Я редактировал мой anser, предлагая другое изменение в вашем коде для решения проблемы с подписью – max66
Спасибо, что определенно решил! –