Из этой же серии. Идёт урок "Закон Божий", преподаватель обращается к ученику: - Отрок Евгений, повествуй нам: отделима ли душа от тела? - Отделима. - Обоснуй. - Иду я давеча утром мимо вашей кельи, отец Павел, и слышу такие слова: "А теперь , душа моя, одевайся и ступай себе с Богом..."
Только сегодня наткнулся на эту тему, но всё же стоит кое-что добавить.
ЦитатаДаджжаль ()
03 71 83 XOR FF FF FF = FC 8E 7C - это пям на поверхности, аж "светится" на экране
Другими словами, что то же самое, но проще и нагляднее: FC 8E 7C являются инверсными значениями 03 71 83. Это действительно бросается сразу в глаза тому, кто свободно оперирует шестнадцатеричными значениями. Тем, кто не владеет этим, в помощь хотя бы виндовский калькулятор: выбираем вид программиста и ставим "галочку" 1 байт. Набираем, например, 03 not и получаем - FC. Not - это инверсия. 03 XOR FF = FC - это тоже инверсия, которая вытекает из таблицы истинности операции XOR.
ЦитатаДаджжаль ()
црц16 для этих 3-х байт с ксорами равна CD F1 (F1 CD с поменянными местами байтами). Старший байт F1 совпадает, младший нет. Так часто делают, сравнивая црц по маске. Маска в данном случае - 00 1B.
Тут надо пояснить. CRC - это только алгоритм, который имеет несколько параметров, которые, в свою очередь, могут иметь множество значений, из-за которых CRC для одних и тех же байт может иметь огромное количество вариантов. Поэтому, чтобы считать CRC, надо знать параметры, которые закладывает производитель, иначе - "пальцем в небо". К счастью, многие фирмы используют выработанные и стандартизированные наработки параметров с присвоенными именами. В данном случае надо считать CRC-16 по стандарту MODBUS и тогда получим нужный результат. MODBUS - это CRC-16 с параметрами: 1. Образующий полином - 8005h 2. Начальное значение CRC - FFFFh 3. Финальный XOR CRC - 0000h 4. Реверс входных байт 5. Реверс CRC Посчитав CRC с данными параметрами трёх байт значений с тремя их инверсными значениями (всего 6 байт), получаем то, что и должны получить, - D6 F1 (в данном файле CRC записана младшим байтом вперёд, поэтому - F1 D6), а вместе с контрольной суммой (6+2=8 байт) получим CRC = 0. То есть, если CRC всех 8 байт не равна нулю - это ошибка. Поэтому просто подбирать значения и смотреть где там что изменилось - пустая трата времени.