CRC (на английски: Cyclic Redundancy Check – проверка на цикличния остатък) е алгоритъм за проверка за грешки при предаване и съхранение на данни чрез използване на контролна сума (контролно число, CRC сума). Устройството източник изчислява CRC сумата на данните, които следва да бъдат проверявани и я изпраща заедно със самите данни. Устройството получател извършва същото изчисление след прочитане на данните и контролната сума и установява тяхната непокътнатост чрез сравняване на записаната CRC сума и новоизчислената CRC сума. Ако двете суми не съвпадат, CRC може да коригира информацията или да поиска наново изпращането ѝ.[1]

Изчисление

редактиране

Определянето на CRC кода зависи от т.нар. генератор на полиноми. Контролната сума се получава от остатъка от деление на полиноми, където блокът информация е делимо, а CRC полиномът е делител.

В долния пример се кодира съобщение от 14 бита с 3-битов CRC, чийто полином е x3 + x + 1. Полиномът трябва да бъде представен в бинарна форма, така че се поставят коефициенти 1 или 0 пред всеки член. В нашия случай коефициентите са 1x3 + 0x2 + 1x + 1 (1011).

Съобщение за кодиране:

11010011101100

В края на съобщението добавяме толкова нули, колкото бита е дължината на CRC. В нашия CRC е 3-битов:

11010011101100 000 ← добавяме 3 нули
1011               ← делител, коефициентите от полинома

Алгоритъмът използва логическата операция XOR на числата точно над делителя. Числата, които не са над делителя се копират директно на долния ред. След това делителят се премества един бит надясно и процесът се повтаря, докато делителят стигне най-дясната част на съобщението.

11010011101100 000 ← добавяме 3 нули
1011               ← делител, коефициентите от полинома
01100011101100 000 ← резултат (забележете, че само първите 4 бита са променени от операцията XOR)
 1011              ← делител
00111011101100 000
  1011
00010111101100 000
   1011
00000001101100 000 ← делителят се премества докато срещне 1 в делимото (нулите се пропускат)
       1011
00000000110100 000
        1011
00000000011000 000
         1011
00000000001110 000
          1011
00000000000101 000
           101 1
------------------
00000000000000 100 ← остатък (3 бита)

Стандарти

редактиране
Име Полином / Приложение Представяне: нормално / обратно / обратно реципрочно
CRC-1   (повечето хардуер; познат е и като бит за паритет) 0x1 / 0x1 / 0x1
CRC-4-ITU   (ITU-T) 0x3 / 0xC / 0x9
CRC-5-EPC   (Gen 2 RFID) 0x09 / 0x12 / 0x14
CRC-5-ITU   (ITU-T) 0x15 / 0x15 / 0x1A
CRC-5-USB   (USB) 0x05 / 0x14 / 0x12
CRC-6-ITU   (ITU-T) 0x03 / 0x30 / 0x21
CRC-7   (системи на телекоми, ITU-T, MMC, SD) 0x09 / 0x48 / 0x44
CRC-8-CCITT   (ATM HEC), ISDN Header Error Control, Cell Delineation, ITU-T 0x07 / 0xE0 / 0x83
CRC-8-Dallas/Maxim   (1-Wire шина) 0x31 / 0x8C / 0x98
CRC-8   0xD5 / 0xAB / 0xEA[2]
CRC-8-SAE J1850   0x1D / 0xB8 / 0x8E
CRC-8-WCDMA   0x9B / 0xD9 / 0xCD[2]
CRC-10   (ATM, ITU-T) 0x233 / 0x331 / 0x319
CRC-11   (FlexRay) 0x385 / 0x50E / 0x5C2
CRC-12   (системи на телекоми) 0x80F / 0xF01 / 0xC07[2]
CRC-13-BBC   0x1CF5 / 0x15E7 / 0x1E7A
CRC-15-CAN   0x4599 / 0x4CD1 / 0x62CC
CRC-16-IBM   (Bisync, Modbus, USB, ANSI, много други; познат е и като CRC-16 и CRC-16-ANSI) 0x8005 / 0xA001 / 0xC002
CRC-16-CCITT   (X.25, V.41, HDLC, XMODEM, Bluetooth, SD, много други; познат е и като CRC-CCITT) 0x1021 / 0x8408 / 0x8810[2]
CRC-16-T10-DIF   (SCSI DIF) 0x8BB7 / 0xEDD1 / 0xC5DB
CRC-16-DNP   (DNP, IEC 870, M-Bus) 0x3D65 / 0xA6BC / 0x9EB2
CRC-16-DECT   (безжични телефони) 0x0589 / 0x91A0 / 0x82C4
CRC-24   (FlexRay) 0x5D6DCB / 0xD3B6BA / 0xAEB6E5
CRC-24-Radix-64   (OpenPGP) 0x864CFB / 0xDF3261 / 0xC3267D
CRC-30   (CDMA) 0x2030B9C7 / 0x38E74301 / 0x30185CE3
CRC-32   (ISO 3309, ANSI X3.66, FIPS PUB 71, FED-STD-1003, ITU-T V.42, Ethernet, SATA, MPEG-2, Gzip, PKZIP, POSIX cksum, PNG, ZMODEM) 0x04C11DB7 / 0xEDB88320 / 0x82608EDB[3]
CRC-32C (Castagnoli)   (iSCSI & SCTP, G.hn, SSE4.2) 0x1EDC6F41 / 0x82F63B78 / 0x8F6E37A0[3]
CRC-32K (Koopman)   0x741B8CD7 / 0xEB31D82E / 0xBA0DC66B[3]
CRC-32Q   (авиация; AIXM) 0x814141AB / 0xD5828281 / 0xC0A0A0D5
CRC-40-GSM   (GSM контролен канал) 0x0004820009 / 0x9000412000 / 0x8002410004
CRC-64-ISO   (HDLC – ISO 3309, Swiss-Prot/TrEMBL) 0x000000000000001B / 0xD800000000000000 / 0x800000000000000D
CRC-64-ECMA-182    0x42F0E1EBA9EA3693 / 0xC96C5795D7870F42 / 0xA17870F5D4F51B49

Източници

редактиране