2016-04-30 12 views
1

Контекст: Мой учитель портировал 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-файла, чтобы стать поврежденным?

ответ

2

Для вычисления контрольной суммы вы выполняете XOR всех байтов в файле, а затем возвращаете 0xFF минус это значение.
Файл, переданный методу контрольной суммы, является окончательным файлом с 0x00 в позиции контрольной суммы.

sum = 0xFF - XOR(file) 

Для двоичном, добавление же, как и XOR, следовательно, линия checksum += pagebytes[i];

метод проверки вашего профессора, будет XOR весь файл. То есть исходный аргумент метода контрольной суммы и дополнительный байт, который является результатом метода контрольной суммы.

Таким образом, ожидаемый результат, то:

XOR(file, sum) 
= XOR(file) + sum 
= XOR(file) + 0xFF - XOR(file) 
= 0xFF 
+0

Должно быть обычной практикой, так как он не заметил ... Спасибо :) – user1534664

+0

Я понять, что сумма должна быть 0x00 для XOR (файл), чтобы стать 0xFF. Однако я не понимаю, как вы знаете, что контрольная сумма 0x00 заранее. Почему даже хранить контрольную сумму в page.header, если вы не собираетесь использовать ее при проверке? – user1534664

+0

@ user1534664 Вместо того, чтобы извлекать его и переписывать контрольную сумму и сравнивать, ваш профессор просто воспользовался небольшим трюком. Он все еще используется без извлечения, потому что трюк не будет работать, если значение не было в заголовке. –

0

Предполагая, что заголовок является частью страницы. Затем вы вычисляете сумму всех байтов x и сохраняете 255-x в качестве контрольной суммы. При его проверке вы вычисляете y + 255 - x, который должен быть равен 255. Если это так, x и y - одинаковое число.

Обратите внимание, что все вычисления выполняются по модулю 256, поэтому х и у всегда находятся в диапазоне от 0 до 255.