Оказалось, что црц даже одинакового размера (CRC-8, 16, 32) могут иметь разные параметры, поэтому надо точно знать, какой алгоритм применяется. Разнообразие можно оценить тут: crccalc.com/
К счастью, добрые люди уже написали функцию подсчёта нужного мне црц, поэтому я просто сунул её к себе в код. Тип входных данных там использовался -- UCHAR. В стандартной библиотеке такого типа нет, но по названию было понятно, что это, наверное, синоним для unsigned char. У меня же все данные традиционно были обычными (signed) char. Ну я посмотрел в код, там вроде используются только побитовые операции. А им всё равно, знаковое число или беззнаковое. Сделаю-ка для однообразия вместо UCHAR обычный (signed) char.
Сделал. Не работает.
После того, как я когда-то несколько раз выстрелил себе в ногу, налепив где не надо unsigned, я решил, что по умолчанию лучше всегда использовать signed. Но теперь случилась ситуация, когда решение использовать signed было ошибочным. В чём же была проблема?
В моей невнимательности. Исходный код содержал в себе не только побитовые операции. Там была такая, например, строчка:
iIndex = ucCRCLo ^ *( pData++ );
Где же использовался этот индекс далее? Он использовался при индексации массива, содержащего подготовленные промежуточные данные. Массив имел размер 256 байт и индексы от 0 до 255. Очевидно, что при работе с unsigned char iIndex будет как раз иметь нужный диапазон индексов. Но при работе с signed char... результат тоже будет знаковый. То есть -- от -128 до +127.
Я выходил за границы массива и что-то там шуровал.