расчет контрольной суммы - PullRequest
1 голос
/ 11 мая 2009

Для вычисления CRC я нашел кусок кода, но я не понимаю концепцию. Вот код:

count =128 and ptr=some value;

</p>

<code>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);
}
</code>

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

Ответы [ 4 ]

4 голосов
/ 11 мая 2009

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

3 голосов
/ 11 мая 2009

Один известный текст о CRC - это "Безболезненное руководство по алгоритмам обнаружения ошибок CRC" , автор Ross Williams. Требуется некоторое время, чтобы впитать, но это довольно тщательно.

3 голосов
/ 11 мая 2009

Вы, вероятно, должны знать, что в C оператор ^ является побитовым оператором XOR , а оператор << является оператором левого сдвига (эквивалентно умножению на 2 до степени числа на право оператора). Также выражение crc & 0x8000 проверяет самый значимый битовый набор переменной crc. Это поможет вам выработать низкоуровневое объяснение того, что происходит, когда это выполняется, для объяснения высокого уровня того, что такое CRC и зачем он может понадобиться, прочитайте <a href="http://en.wikipedia.org/wiki/Cyclic_redundancy_check" rel="nofollow noreferrer"> страницу Википедии или Как работает материал .

1 голос
/ 12 ноября 2009
...