расчет контрольной суммы

Чтобы вычислить CRC, я нашел фрагмент кода, но я не понимаю концепции. Вот код:

count =128 and ptr=some value;

calcrc(unsigned char *ptr, int count) { unsigned short crc; unsigned char i; crc = 0; while (--count >= 0) { crc = crc ^ (unsigned short)*ptr++ << 8; i = 8; do { if (crc & 0x8000) crc = crc << 1 ^ 0x1021; else crc = crc << 1; } while(--i); } return (crc); }

Пожалуйста, объясните мне все и объясните логику.


person Community    schedule 11.05.2009    source источник
comment
Я предлагаю вам более конкретно рассказать о том, чего вы не понимаете. Это синтаксис или семантика алгоритма, что-то еще ???   -  person andreas buykx    schedule 11.05.2009


Ответы (4)


Это похоже на CRC (в частности, это похоже на CRC-16-CCITT, используемый такими вещами, как 802.15.4, X.25, V.41, CDMA, Bluetooth, XMODEM, HDLC, PPP и IrDA). Возможно, вы захотите прочитать теорию CRC на странице Википедии, связанной с ней, чтобы получить больше информации. Или вы можете рассматривать это как «черный ящик», который просто решает проблему вычисления контрольной суммы.

person unwind    schedule 11.05.2009

Вам, вероятно, потребуется знать, что в C оператор ^ является побитовым оператором XOR и оператором ‹* оператор - это оператор сдвига влево (эквивалент умножения на 2 в степени числа справа от оператора). Также выражение crc & 0x8000 проверяет набор старших битов переменной crc. Это поможет вам выработать низкоуровневое объяснение того, что происходит при его запуске. Для более подробного объяснения того, что такое CRC и почему он может вам понадобиться, прочтите страница Википедии или Как все работает.

person Martin    schedule 11.05.2009

Один известный текст о CRC - это «Безболезненное руководство по алгоритмам обнаружения ошибок CRC» Росс. Уильямс. На усвоение нужно время, но это довольно основательно.

person Craig McQueen    schedule 11.05.2009

Взгляните на мой ответ на Как я мог угадать алгоритм контрольной суммы ?

person selwyn    schedule 12.11.2009