Trends in LIMS
Циклический избыточный код (англ. Cyclic redundancy check[нет в источнике], CRC[1]) — алгоритм нахождения контрольной суммы, предназначенный для проверки целостности данных[2]. CRC является практическим приложением помехоустойчивого кодирования, основанным на определённых математических свойствах циклического кода.
Введение
Понятие циклические коды — достаточно широкое[3]. В англоязычной литературе CRC понимается двояко в зависимости от контекста: Cyclic Redundancy Code или Cyclic Redundancy Check[4]. Под первым понятием подразумевают математический феномен циклических кодов, под вторым — конкретное применение этого феномена как хеш-функции.
Циклические коды не только просты в реализации, но и обладают тем преимуществом, что подходят для обнаружения пакетных ошибок: непрерывных последовательностей ошибочных символов данных в сообщениях. Это важно, потому что пакетные ошибки являются распространёнными ошибками передачи во многих каналах связи, включая магнитные и оптические устройства. Обычно n‑разрядный CRC, применяемый к блоку данных произвольной длины, и при расположении контрольной суммы непосредственно вслед за данными, обнаруживает любой одиночный пакет ошибок длиной не более n бит, а доля всех более длинных пакетов ошибок, которые он обнаружит, равна (1 − 2−n).
Помехоустойчивое кодирование
Первые попытки создания кодов с избыточной информацией начались задолго до появления современных компьютеров. К примеру, ещё в 1960-х годах Ридом и Соломоном была разработана эффективная методика кодирования — Код Рида-Соломона. Использование её в те времена не представлялось возможным, так как произвести операцию декодирования за разумное время первыми алгоритмами не удавалось. Точку в этом вопросе поставила фундаментальная работа Берлекэмпа, опубликованная в 1968 году. Эта методика, на практическое применение которой указал через год Мэсси, и по сей день используется в цифровых устройствах, обеспечивающих приём RS-кодированных данных. Более того: данная система позволяет не только определять позиции, но и исправлять неверные кодовые символы (чаще всего октеты).
Но далеко не всегда от кода требуется коррекция ошибок. Многие современные каналы связи обладают приемлемыми характеристиками, и зачастую достаточно лишь проверить, успешно ли прошла передача или возникли какие-нибудь сложности; структура же ошибок и конкретные позиции неверных символов совершенно не интересуют принимающую сторону. И в этих условиях очень удачным решением оказались алгоритмы, использующие контрольные суммы. CRC как нельзя лучше подходит для подобных задач: невысокие затраты ресурсов, простота реализации и уже сформированный математический аппарат из теории линейных циклических кодов обеспечили ей огромную популярность.
Хотя код CRC используют обычно только для обнаружения ошибок, его математические свойства дают возможность найти и исправить одиночную ошибку в блоке бит, если каждому биту защищаемого блока (включая проверочные биты) соответствует свой уникальный остаток от деления на порождающий многочлен. Например, если порождающий многочлен неприводим, и длина блока не превышает порядок порождённой циклической группы.
Контрольная сумма
В общем виде контрольная сумма представляет собой некоторое значение, вычисленное по определённой схеме на основе кодируемого сообщения. Проверочная информация при систематическом кодировании приписывается к передаваемым данным. На принимающей стороне абонент знает алгоритм вычисления контрольной суммы: соответственно, программа имеет возможность проверить корректность принятых данных.
При передаче пакетов по сетевому каналу могут возникнуть искажения исходной информации вследствие разных внешних воздействий: электрических наводок, плохих погодных условий и многих других. Сущность методики в том, что при хороших характеристиках контрольной суммы в подавляющем числе случаев ошибка в сообщении приведёт к изменению его контрольной суммы. Если исходная и вычисленная суммы не равны между собой, принимается решение о недостоверности принятых данных, и можно запросить повторную передачу пакета.
Математическое описание
Алгоритм CRC базируется на свойствах деления с остатком двоичных многочленов, то есть многочленов над конечным полем . Значение CRC является по сути остатком от деления многочлена, соответствующего входным данным, на некий фиксированный порождающий многочлен[англ.].
Каждой конечной последовательности битов взаимно однозначно сопоставляется двоичный полином , последовательность коэффициентов которого представляет собой исходную последовательность. Например, последовательность битов 1011010 соответствует многочлену:
Количество различных многочленов степени, меньшей , равно , что совпадает с числом всех двоичных последовательностей длины .
Значение контрольной суммы в алгоритме с порождающим многочленом степени определяется как битовая последовательность длины , представляющая многочлен , получившийся в остатке при делении многочлена , представляющего входной поток бит, на многочлен :
где
- — многочлен, представляющий значение CRC;
- — многочлен, коэффициенты которого представляют входные данные;
- — порождающий многочлен;
- — степень порождающего многочлена.
Умножение осуществляется приписыванием нулевых битов к входной последовательности, что улучшает качество хеширования для коротких входных последовательностей.
При делении с остатком различных исходных многочленов на порождающий полином степени можно получить различных остатков от деления. зачастую является неприводимым многочленом. Обычно его подбирают в соответствии с требованиями к хеш-функции в контексте каждого конкретного применения.
Тем не менее, существует множество стандартизированных образующих многочленов, обладающих хорошими математическими и корреляционными свойствами (минимальное число коллизий, простота вычисления), некоторые из которых перечислены ниже.
Вычисление CRC
Параметры алгоритма
Одним из основных параметров CRC является порождающий полином.
С порождающим полиномом связан другой параметр — его степень, которая определяет количество битов, используемых для вычисления значения CRC. На практике наиболее распространены 8-, 16- и 32-битовые слова, что является следствием особенностей архитектуры современной вычислительной техники.
Ещё одним параметром является начальное (стартовое) значение слова. Указанные параметры полностью определяют «традиционный» алгоритм вычисления CRC. Существуют также модификации алгоритма, например, использующие обратный порядок обработки битов.
Описание процедуры
Из файла берётся первое слово — это может быть битовый (CRC-1), байтовый (CRC-8) или любой другой элемент. Если старший бит в слове «1», то слово сдвигается влево на один разряд с последующим выполнением операции XOR с порождающим полиномом. Соответственно, если старший бит в слове «0», то после сдвига операция XOR не выполняется. После сдвига теряется старший бит, а на место младшего бита загружается очередной бит из файла, и операция повторяется до тех пор, пока не загрузится последний бит файла. После прохождения всего файла в слове остаётся остаток, который и является контрольной суммой.
Популярные и стандартизованные полиномы
В то время как циклические избыточные коды являются частью стандартов, у этого термина не существует общепринятого определения — трактовки различных авторов нередко противоречат друг другу[1][5].
Этот парадокс касается и выбора многочлена-генератора: зачастую стандартизованные полиномы не являются самыми эффективными в плане статистических свойств соответствующего им check redundancy code.
При этом многие широко используемые полиномы не являются наиболее эффективными из всех возможных. В 1993—2004 годах группа учёных занималась исследованием порождающих многочленов разрядности до 16[1] 24 и 32 бит[6][7] и нашла полиномы, дающие лучшую, нежели стандартизированные многочлены, производительность в смысле кодового расстояния[7]. Один из результатов этого исследования уже нашёл своё применение в протоколе iSCSI.
Самый популярный и рекомендуемый IEEE полином для CRC-32 используется в Ethernet, FDDI; также этот многочлен является генератором кода Хемминга[8]. Использование другого полинома — CRC-32C — позволяет достичь такой же производительности при длине исходного сообщения от 58 бит до 131 кбит, а в некоторых диапазонах длины входного сообщения может быть даже выше, поэтому в наши дни он тоже пользуется популярностью[7]. К примеру, стандарт ITU-T G.hn использует CRC-32C с целью обнаружения ошибок в полезной нагрузке.
Ниже в таблице перечислены наиболее распространённые многочлены — генераторы CRC. На практике вычисление CRC может включать пре- и постинверсию, а также обратный порядок обработки битов. В проприетарных реализациях CRC для усложнения анализа кода применяют ненулевые начальные значения регистров.
Название | Полином | Представления:[9] нормальное / реверсированное / реверсированное от обратного |
---|---|---|
CRC-1 | (используется в аппаратном контроле ошибок; также известен как бит чётности) | 0x1 / 0x1 / 0x1 |
CRC-4-ITU | (ITU G.704[10]) | 0x3 / 0xC / 0x9 |
CRC-5-EPC | (Gen 2 RFID[11]) | 0x09 / 0x12 / 0x14 |
CRC-5-ITU | (ITU G.704[12]) | 0x15 / 0x15 / 0x1A |
CRC-5-USB | (USB token packets) | 0x05 / 0x14 / 0x12 |
CRC-6-ITU | (ITU G.704[13]) | 0x03 / 0x30 / 0x21 |
CRC-7 | (системы телекоммуникации, ITU-T G.707[14], ITU-T G.832[15], MMC, SD) | 0x09 / 0x48 / 0x44 |
CRC-8-CCITT | (ATM HEC), ISDN Header Error Control and Cell Delineation ITU-T I.432.1 (02/99) | 0x07 / 0xE0 / 0x83 |
CRC-8-Dallas/Maxim | (1-Wire bus) | 0x31 / 0x8C / 0x98 |
CRC-8-DVB-S2 | (ETSI EN 302 307[16], 5.1.4) | 0xD5 / 0xAB / 0xEA[1] |
CRC-8-SAE J1850 | 0x1D / 0xB8 / 0x8E | |
CRC-10 | 0x233 / 0x331 / 0x319 | |
CRC-11 | (FlexRay[17]) | 0x385 / 0x50E / 0x5C2 |
CRC-12 | (системы телекоммуникации[18][19]) | 0x80F / 0xF01 / 0xC07 |
CRC-15-CAN | 0x4599 / 0x4CD1 / 0x62CC | |
CRC-16-IBM | (Bisync, Modbus, USB, ANSI X3.28[20], многие другие; также известен как CRC-16 и CRC-16-ANSI) | 0x8005 / 0xA001 / 0xC002 |
CRC-16-CCITT | (X.25, HDLC, XMODEM, Bluetooth, SD и др.) | 0x1021 / 0x8408 / 0x8810[1] |
CRC-16-T10-DIF | (SCSI DIF) | 0x8BB7[21] / 0xEDD1 / 0xC5DB |
CRC-16-DNP | (DNP, IEC 870, M-Bus) | 0x3D65 / 0xA6BC / 0x9EB2 |
CRC-16-Fletcher | Не CRC; см. Fletcher's checksum | Используется в Adler-32 A & B CRC |
CRC-24 | (FlexRay[17]) | 0x5D6DCB / 0xD3B6BA / 0xAEB6E5 |
CRC-24-Radix-64 | (OpenPGP) | 0x864CFB / 0xDF3261 / 0xC3267D |
CRC-30 | (CDMA) | 0x2030B9C7 / 0x38E74301 / 0x30185CE3 |
CRC-32-Adler | Не CRC; см. Adler-32 | См. Adler-32 |
CRC-32-IEEE 802.3 | (V.42, MPEG-2, PNG[22], POSIX cksum) | 0x04C11DB7 / 0xEDB88320 / 0x82608EDB[7] |
CRC-32C (Castagnoli) | (iSCSI, G.hn payload) | 0x1EDC6F41 / 0x82F63B78 / 0x8F6E37A0[7] |
CRC-32K (Koopman) | 0x741B8CD7 / 0xEB31D82E / 0xBA0DC66B[7] | |
CRC-32Q | (aviation; AIXM[23]) | 0x814141AB / 0xD5828281 / 0xC0A0A0D5 |
CRC-64-ISO | (HDLC — ISO 3309) | 0x000000000000001B / 0xD800000000000000 / 0x800000000000000D |
CRC-64-ECMA | [24] | 0x42F0E1EBA9EA3693 / 0xC96C5795D7870F42 / 0xA17870F5D4F51B49 |
Существующие стандарты CRC-128 (IEEE) и CRC-256 (IEEE) в настоящее время[когда?] вытеснены криптографическими хеш-функциями.
Спецификации алгоритмов CRC
Одной из самых известных является методика Ross N. Williams[25]. В ней используются следующие параметры:
- Название алгоритма (name);
- Степень порождающего контрольную сумму многочлена (width);
- Сам производящий полином (poly). Для того, чтобы записать его в виде значения, его сначала записывают как битовую последовательность, при этом старший бит опускается — он всегда равен 1. К примеру, многочлен в данной нотации будет записан числом . Для удобства полученное двоичное представление записывают в шестнадцатеричной форме. Для нашего случая оно будет равно или 0x11;
- Стартовые данные (init), то есть значения регистров на момент начала вычислений;
- Флаг (RefIn), указывающий на начало и направление вычислений, для обнаружения пакетов ошибок должно соответствовать порядку передачи в канале[англ.]. Существует два варианта: False — начиная со старшего значащего бита (MSB-first) или True — с младшего (LSB-first);
- Флаг (RefOut), определяющий, инвертируется ли порядок битов регистра при входе на элемент XOR;
- Число (XorOut), с которым складывается по модулю 2 полученный результат;
- Значение CRC (check) для строки «123456789» .
- Примеры[26]
Name | Width | Poly | Init | RefIn | RefOut | XorOut | Check |
---|---|---|---|---|---|---|---|
CRC-3/ROHC | 3 | 0x3 | 0x7 | true | true | 0x0 | 0x6 |
CRC-4/ITU | 4 | 0x3 | 0x0 | true | true | 0x0 | 0x7 |
CRC-5/EPC | 5 | 0x9 | 0x9 | false | false | 0x0 | 0x0 |
CRC-5/ITU | 5 | 0x15 | 0x0 | true | true | 0x0 | 0x7 |
CRC-5/USB | 5 | 0x5 | 0x1F | true | true | 0x1F | 0x19 |
CRC-6/CDMA2000-A | 6 | 0x27 | 0x3F | false | false | 0x0 | 0xD |
CRC-6/CDMA2000-B | 6 | 0x7 | 0x3F | false | false | 0x0 | 0x3B |
CRC-6/DARC | 6 | 0x19 | 0x0 | true | true | 0x0 | 0x26 |
CRC-6/ITU | 6 | 0x3 | 0x0 | true | true | 0x0 | 0x6 |
CRC-7 | 7 | 0x9 | 0x0 | false | false | 0x0 | 0x75 |
CRC-7/ROHC | 7 | 0x4F | 0x7F | true | true | 0x0 | 0x53 |
CRC-8 | 8 | 0x7 | 0x0 | false | false | 0x0 | 0xF4 |
CRC-8/CDMA2000 | 8 | 0x9B | 0xFF | false | false | 0x0 | 0xDA |
CRC-8/DARC | 8 | 0x39 | 0x0 | true | true | 0x0 | 0x15 |
CRC-8/DVB-S2 | 8 | 0xD5 | 0x0 | false | false | 0x0 | 0xBC |
CRC-8/EBU | 8 | 0x1D | 0xFF | true | true | 0x0 | 0x97 |
CRC-8/I-CODE | 8 | 0x1D | 0xFD | false | false | 0x0 | 0x7E |
CRC-8/ITU | 8 | 0x7 | 0x0 | false | false | 0x55 | 0xA1 |
CRC-8/MAXIM | 8 | 0x31 | 0x0 | true | true | 0x0 | 0xA1 |
CRC-8/ROHC | 8 | 0x7 | 0xFF | true | true | 0x0 | 0xD0 |
CRC-8/WCDMA | 8 | 0x9B | 0x0 | true | true | 0x0 | 0x25 |
CRC-10 | 10 | 0x233 | 0x0 | false | false | 0x0 | 0x199 |
CRC-10/CDMA2000 | 10 | 0x3D9 | 0x3FF | false | false | 0x0 | 0x233 |
CRC-11 | 11 | 0x385 | 0x1A | false | false | 0x0 | 0x5A3 |
CRC-12/3GPP | 12 | 0x80F | 0x0 | false | true | 0x0 | 0xDAF |
CRC-12/CDMA2000 | 12 | 0xF13 | 0xFFF | false | false | 0x0 | 0xD4D |
CRC-12/DECT | 12 | 0x80F | 0x0 | false | false | 0x0 | 0xF5B |
CRC-13/BBC | 13 | 0x1CF5 | 0x0 | false | false | 0x0 | 0x4FA |
CRC-14/DARC | 14 | 0x805 | 0x0 | true | true | 0x0 | 0x82D |
CRC-15 | 15 | 0x4599 | 0x0 | false | false | 0x0 | 0x59E |
CRC-15/MPT1327 | 15 | 0x6815 | 0x0 | false | false | 0x1 | 0x2566 |
CRC-16/ARC | 16 | 0x8005 | 0x0 | true | true | 0x0 | 0xBB3D |
CRC-16/AUG-CCITT | 16 | 0x1021 | 0x1D0F | false | false | 0x0 | 0xE5CC |
CRC-16/BUYPASS | 16 | 0x8005 | 0x0 | false | false | 0x0 | 0xFEE8 |
CRC-16/CCITT-FALSE | 16 | 0x1021 | 0xFFFF | false | false | 0x0 | 0x29B1 |
CRC-16/CDMA2000 | 16 | 0xC867 | 0xFFFF | false | false | 0x0 | 0x4C06 |
CRC-16/DDS-110 | 16 | 0x8005 | 0x800D | false | false | 0x0 | 0x9ECF |
CRC-16/DECT-R | 16 | 0x0589 | 0x0 | false | false | 0x1 | 0x7E |
CRC-16/DECT-X | 16 | 0x0589 | 0x0 | false | false | 0x0 | 0x7F |
CRC-16/DNP | 16 | 0x3D65 | 0x0 | true | true | 0xFFFF | 0xEA82 |
CRC-16/EN-13757 | 16 | 0x3D65 | 0x0 | false | false | 0xFFFF | 0xC2B7 |
CRC-16/GENIBUS | 16 | 0x1021 | 0xFFFF | false | false | 0xFFFF | 0xD64E |
CRC-16/MAXIM | 16 | 0x8005 | 0x0 | true | true | 0xFFFF | 0x44C2 |
CRC-16/MCRF4XX | 16 | 0x1021 | 0xFFFF | true | true | 0x0 | 0x6F91 |
CRC-16/RIELLO | 16 | 0x1021 | 0xB2AA | true | true | 0x0 | 0x63D0 |
CRC-16/T10-DIF | 16 | 0x8BB7 | 0x0 | false | false | 0x0 | 0xD0DB |
CRC-16/TELEDISK | 16 | 0xA097 | 0x0 | false | false | 0x0 | 0xFB3 |
CRC-16/TMS37157 | 16 | 0x1021 | 0x89EC | true | true | 0x0 | 0x26B1 |
CRC-16/USB | 16 | 0x8005 | 0xFFFF | true | true | 0xFFFF | 0xB4C8 |
CRC-A | 16 | 0x1021 | 0xC6C6 | true | true | 0x0 | 0xBF05 |
CRC-16/KERMIT | 16 | 0x1021 | 0x0 | true | true | 0x0 | 0x2189 |
CRC-16/MODBUS | 16 | 0x8005 | 0xFFFF | true | true | 0x0 | 0x4B37 |
CRC-16/X-25 | 16 | 0x1021 | 0xFFFF | true | true | 0xFFFF | 0x906E |
CRC-16/XMODEM | 16 | 0x1021 | 0x0 | false | false | 0x0 | 0x31C3 |
CRC-24 | 24 | 0x864CFB | 0xB704CE | false | false | 0x0 | 0x21CF02 |
CRC-24/FLEXRAY-A | 24 | 0x5D6DCB | 0xFEDCBA | false | false | 0x0 | 0x7979BD |
CRC-24/FLEXRAY-B | 24 | 0x5D6DCB | 0xABCDEF | false | false | 0x0 | 0x1F23B8 |
CRC-31/PHILIPS | 31 | 0x04C11DB7 | 0x7FFFFFFF | false | false | 0x7FFFFFFF | 0xCE9E46C |
CRC-32/zlib | 32 | 0x04C11DB7 | 0xFFFFFFFF | true | true | 0xFFFFFFFF | 0xCBF43926 |
CRC-32/BZIP2 | 32 | 0x04C11DB7 | 0xFFFFFFFF | false | false | 0xFFFFFFFF | 0xFC891918 |
CRC-32C | 32 | 0x1EDC6F41 | 0xFFFFFFFF | true | true | 0xFFFFFFFF | 0xE3069283 |
CRC-32D | 32 | 0xA833982B | 0xFFFFFFFF | true | true | 0xFFFFFFFF | 0x87315576 |
CRC-32/MPEG-2 | 32 | 0x04C11DB7 | 0xFFFFFFFF | false | false | 0x0 | 0x376E6E7 |
CRC-32/POSIX | 32 | 0x04C11DB7 | 0x0 | false | false | 0xFFFFFFFF | 0x765E7680 |
CRC-32Q | 32 | 0x814141AB | 0x0 | false | false | 0x0 | 0x3010BF7F |
CRC-32/JAMCRC | 32 | 0x04C11DB7 | 0xFFFFFFFF | true | true | 0x0 | 0x340BC6D9 |
CRC-32/XFER | 32 | 0xAF | 0x0 | false | false | 0x0 | 0xBD0BE338 |
CRC-40/GSM | 40 | 0x4820009 | 0x0 | false | false | 0xFFFFFFFFFF | 0xD4164FC646 |
CRC-64 | 64 | 0x42F0E1EBA9EA3693 | 0x0 | false | false | 0x0 | 0x6C40DF5F0B497347 |
CRC-64/WE | 64 | 0x42F0E1EBA9EA3693 | 0xFFFFFFFFFFFFFFFF | false | false | 0xFFFFFFFFFFFFFFFF | 0x62EC59E3F1A4F00A |
CRC-64/XZ | 64 | 0x42F0E1EBA9EA3693 | 0xFFFFFFFFFFFFFFFF | true | true | 0xFFFFFFFFFFFFFFFF | 0x995DC9BBDF1939FA |
Примечания
- ↑ 1 2 3 4 5 Philip Koopman, Tridib Chakravarty. Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks (2004). Дата обращения: ???. Архивировано 22 августа 2011 года.
- ↑ Интернет-университет информационных технологий. Лекция: Организация беспроводных сетей . Дата обращения: 30 июля 2011. Архивировано 12 ноября 2011 года.
- ↑ Интернет-университет информационных технологий Лекция: Алгоритмы сети Ethernet/Fast Ethernet . Дата обращения: 30 июля 2011. Архивировано 28 января 2010 года.
- ↑ Walma, M.; Pipelined Cyclic Redundancy Check (CRC) Calculation . Дата обращения: 30 июля 2011. Архивировано 5 ноября 2011 года.
- ↑ Greg Cook. Catalogue of parameterised CRC algorithms (29 апреля 2009). Дата обращения: ???. Архивировано 22 августа 2011 года.
- ↑ G. Castagnoli, S. Braeuer, M. Herrman. Optimization of Cyclic Redundancy-Check Codes with 24 and 32 Parity Bits // IEEE Transactions on Communications. — июнь 1993. — Т. 41, № 6. — С. 883. — doi:10.1109/26.231911.
- ↑ 1 2 3 4 5 6 P. Koopman. 32-Bit Cyclic Redundancy Codes for Internet Applications // The International Conference on Dependable Systems and Networks. — июнь 2002. — С. 459. — doi:10.1109/DSN.2002.1028931. Архивировано 29 марта 2008 года.
- ↑ Brayer, K (1975). "Evaluation of error detection polynomial performance on the AUTOVON channel". Conference Record. National Telecommunications Conference, New Orleans, La. Vol. 1. New York: Institute of Electrical and Electronics Engineers. pp. 8—21 to 8-25.
{{cite conference}}
: Неизвестный параметр|coauthors=
игнорируется (|author=
предлагается) (справка); Неизвестный параметр|month=
игнорируется (справка) - ↑ В представлениях опущен старший бит.
- ↑ G.704 Архивная копия от 9 октября 2012 на Wayback Machine, p. 12
- ↑ Class-1 Generation-2 UHF RFID Protocol version 1.2.0. — 23 октября 2008. — С. 35. Архивировано 20 ноября 2008 года.
- ↑ G.704 Архивная копия от 9 октября 2012 на Wayback Machine, p. 9
- ↑ G.704 Архивная копия от 9 октября 2012 на Wayback Machine, p. 3
- ↑ G.707 : Network node interface for the synchronous digital hierarchy (SDH) . Дата обращения: 16 октября 2009. Архивировано 7 октября 2012 года.
- ↑ G.832 : Transport of SDH elements on PDH networks — Frame and multiplexing structures . Дата обращения: 16 октября 2009. Архивировано 12 октября 2012 года.
- ↑ EN 302 307. Digital Video Broadcasting (DVB); Second generation framing structure, channel coding and modulation systems for Broadcasting, Interactive Services, News Gathering and other broadband satellite applications (DVB-S2) . Дата обращения: 19 сентября 2011. Архивировано 4 июля 2012 года.
- ↑ 1 2 FlexRay Protocol Specification version 2.1 Revision A. — 22 декабря 2005. — С. 93.
- ↑ A. Perez, Wismer, Becker. Byte-Wise CRC Calculations // IEEE Micro. — 1983. — Т. 3, № 3. — С. 40—50. — doi:10.1109/MM.1983.291120.
- ↑ T. V. Ramabadran, S. S. Gaitonde. A tutorial on CRC computations // IEEE Micro. — 1988. — Т. 8, № 4. — С. 62—75. — doi:10.1109/40.7773.
- ↑ Архивированная копия . Дата обращения: 16 октября 2009. Архивировано из оригинала 1 октября 2009 года.
- ↑ Pat Thaler. 16-bit CRC polynomial selection . INCITS T10 (28 августа 2003). Дата обращения: ???. Архивировано 22 августа 2011 года.
- ↑ Thomas Boutell, Glenn Randers-Pehrson и др. PNG (Portable Network Graphics) Specification, Version 1.2 (14 июля 1998). Дата обращения: ???. Архивировано 22 августа 2011 года.
- ↑ AIXM Primer version 4.5 . European Organisation for the Safety of Air Navigation (20 марта 2006). Дата обращения: ???. Архивировано 22 августа 2011 года.
- ↑ ECMA-182 Архивная копия от 31 июля 2020 на Wayback Machine p. 51
- ↑ Ross N. Williams. CRC Rocksoft (1993). Дата обращения: 17 апреля 2012. Архивировано из оригинала 3 сентября 2011 года.
- ↑ Greg Cook. Catalogue of parametrised CRC algorithms (18 января 2016). Дата обращения: 1 февраля 2016. Архивировано 9 января 2016 года.
Литература
- Генри С. Уоррен, мл. Глава 5. Подсчет битов // Алгоритмические трюки для программистов = Hacker’s Delight. — М.: Вильямс, 2007. — 288 с. — ISBN 0-201-91465-4.
Ссылки
- Элементарное руководство по CRC алгоритмам обнаружения ошибок
- CRC, и как его восстановить
- Генератор CRC-функций на языках VHDL и Verilog
- Ross N. Williams/Anarchriz. Всё о CRC32 // Ross N. Williams. Элементарное руководство по CRC алгоритмам обнаружения ошибок
- Ross N. Williams. A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS (англ.)
- CRC Калькуляторы
- CRC-калькулятор, написан на Qt
- On-line CRC32-калькулятор, для строк (можно менять кодировку и формат EndLine)
- On-line CRC-калькулятор
- On-line CRC-калькулятор crccalc.com
- On-line CRC calculation and free library