Контекст: Мой учитель портировал Darwin-OP Framework с C++ на Java, позволяя студентам, как я, использовать его без необходимости владения C++. У Дарвина есть два контроллера: главный контроллер запускает Linux и запускает Java-код и имеет последовательное соединение с дополнительным контроллером (микроконтроллером), который управляет всеми датчиками/сервоприводами и преобразователями.Как эта часть кода проверяет контрольную сумму?
Дарвин использует motion.bin файл, в котором хранится список из 256 страниц. Каждая страница составляет 512 (8 * 64) байтов и состоит из 7 шагов (по 64 байта) плюс заголовок страницы (также 64 байта). Каждый шаг содержит позиции (значение между 0-4095) для сервопривода. Поэтому, чтобы Дарвин двигал рукой, он проходит (< 7) количество шагов, пока не закончит последний шаг.
Внутри заголовка страницы есть контрольная сумма в 1 байт. Код Java содержит два метода, в котором контрольная сумма рассчитывается и проверены:
private static boolean VerifyChecksum(PAGE page) {
byte checksum = (byte)0x00;
byte[] pagebytes = page.GetBytes();
for (int i = 0; i < pagebytes.length; i++) {
checksum += pagebytes[i];
}
if (checksum != (byte)0xFF) {
return false;
}
return true;
}
private static void SetChecksum(PAGE page) {
byte checksum = (byte)0x00;
byte[] pagebytes = page.GetBytes();
page.header.checksum = (byte)0x00;
for (int i = 0; i < pagebytes.length; i++) {
checksum += pagebytes[i];
}
page.header.checksum = (byte)((byte)0xFF - checksum);
}
Главный вопрос: Может кто-нибудь объяснить, как проверяется контрольная сумма? Я не понимаю, почему он проверяет checksum != (byte)0xFF
. Почему бы просто не сравнить рассчитанный checksum
с page.header.checksum
?
Вопрос с бонусом: Зачем стоит проверять целостность файла в первую очередь? Будет ли это распространено для страницы внутри .bin-файла, чтобы стать поврежденным?
Должно быть обычной практикой, так как он не заметил ... Спасибо :) – user1534664
Я понять, что сумма должна быть 0x00 для XOR (файл), чтобы стать 0xFF. Однако я не понимаю, как вы знаете, что контрольная сумма 0x00 заранее. Почему даже хранить контрольную сумму в page.header, если вы не собираетесь использовать ее при проверке? – user1534664
@ user1534664 Вместо того, чтобы извлекать его и переписывать контрольную сумму и сравнивать, ваш профессор просто воспользовался небольшим трюком. Он все еще используется без извлечения, потому что трюк не будет работать, если значение не было в заголовке. –