Отвечая скорее за тех, кто попал сюда во время поиска совета.
Ключевым моментом является то, что несколько пунктов в тесно связанных рекомендациях МСЭ-Т (например, Q.921, уже достаточно давно доступны в сети) говорят:
1. бит самого младшего разряда передается (и, таким образом, принимается) первым
Это унаследованное поведение противоречит правилам повседневной жизни, когда цифры высшего порядка записываются первыми в порядке чтения, а все универсальные онлайн-калькуляторы и библиотеки выполняют вычисления с использованием обычного порядка и предоставляют необязательные настройки, облегчающие обратное. один.
Поэтому вы должны спросить онлайн калькулятор
- чтобы изменить порядок бит в сообщении, которое вы вводите в «обычном» формате перед выполнением вычисления,
- чтобы изменить порядок следования битов результата, чтобы получить их в
тот же порядок, что и в самом сообщении
Вполне разумно, что некоторые калькуляторы предлагают только одну общую настройку для обоих.
В связи с этим в предыдущем ответе рекомендуются настройки "обратный байт данных" и "обратный результат CRC перед окончательным XOR";
2. результат вычисления CRC должен быть инвертирован по битам перед отправкой
Инверсия битов - это еще одно имя "xor by 0xffff ...". Есть цель инвертировать биты результата вычисления CRC перед отправкой его в качестве сообщения FCS (последние два байта сообщения, '93 ac 'в вашем примере).
Подробнее см. Пункт 4.
Это обусловливает настройку «Конечное значение ffff», имя которой вводит в заблуждение, поскольку фактически определяет шаблон, который будет для xor'ed с результатом вычисления. Поскольку такая операция требуется для нескольких типов CRC, только шаблоны xor варьируются от 0 (без операции) до 0xfff ... (полная инверсия), универсальные калькуляторы / библиотеки предлагают его для простоты использования.
3. расчет должен включать обработку ведущей последовательности 0xffff
Это обосновывает точку "начальное значение ffff".
4. на принимающей (проверяющей) стороне рекомендуется протолкнуть полное сообщение, то есть FCS, через вычисление CRC, и ожидать, что результат будет 0x1d0f
За этим стоит некоторое умное мышление:
внутреннее свойство алгоритма CRC заключается в том, что
CRC (x.CRC (x))
всегда равно 0 (x представляет исходное сообщение, а "." Представляет сцепление).
выполнение полного сообщения через расчет, а не
вычисление только самого сообщения и сравнение с FCS
полученный отдельно означает гораздо более простой алгоритм (или даже схему)
на принимающей стороне.
однако слишком легко допустить ошибку кодирования, приводящую к тому, что результат становится равным 0. К счастью, благодаря внутренним свойствам алгоритма CRC,
CRC (x. (CRC (x)) ')
дает постоянное значение, не зависящее от x и отличное от 0 (по крайней мере для CRC-CCITT, о котором мы поговорим здесь). Знак «» представляет инверсию битов, требуемую в пункте 2.