Всегда ли верно, что CR C буфера, к которому добавлен CR C, всегда равен 0?
Зависит от CR C и как это добавляется. Для 16-битного и 32-битного CR C "CCITT", используемого в сети (Ethe rnet, V42 ..), no : конечный CR C (добавляется в указанном порядке ) - это константа , но не ноль: 47 0F
для 16-битного CR C, 1C DF 44 21
для 32-битного CR C. 16-битный пример
-------- message -------- CRC-CCITT-16
01 02 03 04 05 06 07 08 D4 6D
01 02 03 04 05 06 07 08 D4 6D 47 0F
DE AD BE EF CB E5
DE AD BE EF CB E5 47 0F
Это удобно в телекоммуникациях, где часто получатель, обрабатывающий уровни, знает, что кадр заканчивается только после получения CR C, который уже был введен в аппаратном обеспечении, проверяющем CR C.
Основная причина заключается в том, что 16-битный CR C 8-байтового сообщения m0 m1 … m6 m7
определяется как остаток последовательности /m0 /m1 m2 m3 … m6 m7 FF FF
порождающим полиномом.
Когда мы вычисляем CR C сообщения, за которым следует исходный CR C r0 r1
, новый CR C, таким образом, является остатком последовательности /m0 /m1 m2 m3 … m6 m7 r0 r1 FF FF
генерирующим полиномом и, следовательно, остатком от последовательность FF FF FF FF
производящим полиномом, то есть константой, но не имеет оснований быть равной нулю.
Попробуйте онлайн в Python! . Включает 16-битную и 32-битную "вручную" и использует внешнюю библиотеку, в том числе библиотеку, в которой константа равна нулю.
Для CRC, которые не добавляют правильное количество бит или выводят CR C неправильный (эти варианты - легион), результат зависит от сообщения. Это верный признак того, что что-то не так, и соответственно
- получатель больше не может вводить CR C сообщения в средство проверки CR C и сравнивать результат с константой для проверки. целостность сообщения.
- теряется желаемое свойство CR C, что любая ошибка, сконцентрированная на последовательности битов не длиннее CR C, перехватывается (если мы не получим CR C прямо, ошибка, которая перекрывает конец сообщения и CR C может когда-нибудь остаться незамеченной)