Расчет FCS (CRC) для кадра HDLC - PullRequest
       17

Расчет FCS (CRC) для кадра HDLC

3 голосов
/ 02 ноября 2011

У меня есть следующий кадр:

7e  01 00  00  01  00  18  ef  00  00  00   b5   20 c1 05 10 02 71 2e 1a c2 05 10 01 71 00 6e 87 02 00 01 42 71 2e 1a 01 96 27 be 27 54 17 3d b9 93 ac 7e

Если я правильно понимаю, то именно эта часть кадра рассчитана для FCS:

010000010018ef000000b520c1051002712e1ac205100171006e8702000142712e1a019627be2754173db9

Я пытался ввести это в число онлайн-калькуляторов, но я не могу произвести 0x93ac из приведенных выше данных.

http://www.lammertbies.nl/comm/info/crc-calculation.html с типом ввода hex.

Как появился 0x93ac?

Спасибо

Barry

Ответы [ 2 ]

8 голосов
/ 03 сентября 2015

Отвечая скорее за тех, кто попал сюда во время поиска совета.

Ключевым моментом является то, что несколько пунктов в тесно связанных рекомендациях МСЭ-Т (например, 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.

4 голосов
/ 12 января 2012

Прежде всего, значение CRC составляет 0xac93

Используйте этот калькулятор: http://www.zorc.breitbandkatze.de/crc.html

  • Установить заказ CRC 16
  • Полином 1021
  • Начальное значение ffff
  • Конечное значение ffff
  • "обратные байты данных"
  • «Обратный результат CRC до окончательного XOR»
  • Введите вашу последовательность как:

    %01%00%00%01%00%18%ef%00%00%00%b5%20%c1%05%10%02%71%2e%1a%c2%05%10%01%71%00%6e%87%02%00%01%42%71%2e%1a%01%96%27%be%27%54%17%3d%b9
    
  • Нажмите "Рассчитать", и вы получите 0xAC93
...