Циклический избыточный код

Поделись знанием:
Перейти к: навигация, поиск

Циклический избыточный код (англ. Cyclic redundancy check, CRC[1]) — алгоритм нахождения контрольной суммы, предназначенный для проверки целостности данных[2]. CRC является практическим приложением помехоустойчивого кодирования, основанном на определённых математических свойствах циклического кода.





Введение

Понятие циклические коды достаточно широкое[3]. В англоязычной литературе CRC расшифровывается двояко в зависимости от контекста: Cyclic Redundancy Code или Cyclic Redundancy Check[4]. Под первой расшифровкой понимают математический феномен циклических кодов, под второй — конкретное применение этого феномена как хэш-функции.

Помехоустойчивое кодирование

Первые попытки создания кодов с избыточной информацией начались задолго до появления современных компьютеров. К примеру, ещё в 1960-х годах Ридом и Соломоном была разработана эффективная методика кодирования — Код Рида-Соломона. Использование её в те времена не представлялось возможным, так как произвести операцию декодирования за разумное время первыми алгоритмами не удавалось. Точку в этом вопросе поставила фундаментальная работа Берлекампа, опубликованная в 1968 году. Эта методика, на практическое применение которой указал через год Мэсси, и по сей день используется в цифровых устройствах, обеспечивающих приём RS-кодированных данных. Более того: данная система позволяет не только определять позиции, но и исправлять неверные кодовые символы (чаще всего октеты).

Но далеко не всегда от кода требуется коррекция ошибок. Многие современные каналы связи обладают приемлемыми характеристиками, и зачастую достаточно лишь проверить, успешно ли прошла передача или возникли какие-нибудь сложности; структура же ошибок и конкретные позиции неверных символов совершенно не интересуют принимающую сторону. И в этих условиях очень удачным решением оказались алгоритмы, использующие контрольные суммы. CRC как нельзя лучше подходит для подобных задач: невысокие затраты ресурсов, простота реализации и уже сформированный математический аппарат из теории линейных циклических кодов обеспечили ей огромную популярность.

Контрольная сумма

В общем виде контрольная сумма представляет собой некоторое значение, вычисленное по определённой схеме на основе кодируемого сообщения. Проверочная информация при систематическом кодировании приписывается к передаваемым данным. На принимающей стороне абонент знает алгоритм вычисления контрольной суммы: соответственно, программа имеет возможность проверить корректность принятых данных.

При передаче пакетов по сетевому каналу могут возникнуть искажения исходной информации вследствие разных внешних воздействий: электрических наводок, плохих погодных условий и многих других. Сущность методики в том, что при хороших характеристиках контрольной суммы в подавляющем числе случаев ошибка в сообщении приведёт к изменению его контрольной суммы. Если исходная и вычисленная суммы не равны между собой, принимается решение о недостоверности принятых данных, и можно запросить повторную передачу пакета.

Математическое описание

Алгоритм CRC базируется на свойствах деления с остатком двоичных многочленов, то есть многочленов над конечным полем <math> GF(2) </math>. Значение CRC является по сути остатком от деления многочлена, соответствующего входным данным, на некий фиксированный порождающий многочлен.

Каждой конечной последовательности битов <math>a_0, a_1, \dots, a_{N-1}</math> взаимно однозначно сопоставляется двоичный полином <math>\textstyle\sum_{n=0}^{N-1} a_n x^n</math>, последовательность коэффициентов которого представляет собой исходную последовательность. Например, последовательность битов 1011010 соответствует многочлену:

<math>P(x) = 1\cdot x^6 + 0\cdot x^5 + 1\cdot x^4 + 1\cdot x^3 + 0\cdot x^2 + 1\cdot x^1 + 0\cdot x^0 = x^6 + x^4 + x^3 + x^1.</math>

Количество различных многочленов степени меньшей <math> N </math> равно <math> 2^N </math>, что совпадает с числом всех двоичных последовательностей длины <math> N </math> .

Значение контрольной суммы в алгоритме с порождающим многочленом <math>G(x)</math> степени <math>N</math> определяется как битовая последовательность длины <math>N</math>, представляющая многочлен <math>R(x)</math>, получившийся в остатке при делении многочлена <math>P(x)</math>, представляющего входной поток бит, на многочлен <math>G(x)</math>:

<math>R(x) = P(x)\cdot x^N\, \bmod\, G(x)</math>

где

<math>R(x)</math> — многочлен, представляющий значение CRC;
<math>P(x)</math> — многочлен, коэффициенты которого представляют входные данные;
<math>G(x)</math> — порождающий многочлен;
<math> N </math> — степень порождающего многочлена.

Умножение <math>x^N</math> осуществляется приписыванием <math>N</math> нулевых битов к входной последовательности, что улучшает качество хеширования для коротких входных последовательностей.

При делении с остатком исходного многочлена на порождающий полином <math>G(x)</math> степени <math>N</math> можно получить <math>2^N</math> различных остатков от деления. <math>G(x)</math> зачастую является неприводимым многочленом. Обычно его подбирают в соответствии с требованиями к хэш-функции в контексте каждого конкретного применения. Тем не менее, существует множество стандартизированных образующих многочленов, обладающих хорошими математическими и корреляционными свойствами (минимальное число коллизий, простота вычисления), некоторые из которых перечислены ниже.


Вычисление CRC

Параметры алгоритма

Одним из основных параметров CRC является порождающий полином.

С порождающим полиномом связан другой параметр — его степень, которая определяет количество битов, используемых для вычисления значения CRC. На практике наиболее распространены 8-, 16- и 32-битовые слова, что является следствием особенностей архитектуры современной вычислительной техники.

Ещё одним параметром является начальное (стартовое) значение слова. Указанные параметры полностью определяют «традиционный» алгоритм вычисления CRC. Существуют также модификации алгоритма, например, использующие обратный порядок обработки битов.

Описание процедуры

Из файла берётся первое слово — это может быть битовый (CRC-1), байтовый (CRC-8) или любой другой элемент. Если старший бит в слове «1», то слово сдвигается влево на один разряд с последующим выполнением операции XOR c порождающим полиномом. Соответственно, если старший бит в слове «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 <math>x + 1</math> (используется в аппаратном контроле ошибок; также известен как бит чётности) 0x1 / 0x1 / 0x1
CRC-4-ITU <math>x^4 + x + 1</math> (ITU G.704[10]) 0x3 / 0xC / 0x9
CRC-5-EPC <math>x^5 + x^3 + 1</math> (Gen 2 RFID[11]) 0x09 / 0x12 / 0x14
CRC-5-ITU <math>x^5 + x^4 + x^2 + 1</math> (ITU G.704[12]) 0x15 / 0x15 / 0x1A
CRC-5-USB <math>x^5 + x^2 + 1</math> (USB token packets) 0x05 / 0x14 / 0x12
CRC-6-ITU <math>x^6 + x + 1</math> (ITU G.704[13]) 0x03 / 0x30 / 0x21
CRC-7 <math>x^7 + x^3 + 1</math> (системы телекоммуникации, ITU-T G.707[14], ITU-T G.832[15], MMC, SD) 0x09 / 0x48 / 0x44
CRC-8-CCITT <math>x^8 + x^2 + x + 1</math> (ATM HEC), ISDN Header Error Control and Cell Delineation ITU-T [www.itu.int/rec/T-REC-I.432.1-199902-I/en I.432.1 (02/99)] 0x07 / 0xE0 / 0x83
CRC-8-Dallas/Maxim <math>x^8 + x^5 + x^4 + 1</math> (1-Wire bus) 0x31 / 0x8C / 0x98
CRC-8 <math>x^8 + x^7 + x^6 + x^4 + x^2 + 1</math> (ETSI EN 302 307[16], 5.1.4) 0xD5 / 0xAB / 0xEA[1]
CRC-8-SAE J1850 <math>x^8 + x^4 + x^3 + x^2 + 1</math> 0x1D / 0xB8 / 0x8E
CRC-10 <math>x^{10} + x^9 + x^5 + x^4 + x + 1</math> 0x233 / 0x331 / 0x319
CRC-11 <math>x^{11} + x^9 + x^8 + x^7 + x^2 + 1</math> (FlexRay[17]) 0x385 / 0x50E / 0x5C2
CRC-12 <math>x^{12} + x^{11} + x^3 + x^2 + x + 1</math> (системы телекоммуникации[18][19]) 0x80F / 0xF01 / 0xC07
CRC-15-CAN <math>x^{15} + x^{14} + x^{10} + x^8 + x^7 + x^4 + x^3 + 1 </math> 0x4599 / 0x4CD1 / 0x62CC
CRC-16-IBM <math>x^{16} + x^{15} + x^2 + 1</math> (Bisync, Modbus, USB, ANSI X3.28[20], многие другие; также известен как CRC-16 и CRC-16-ANSI) 0x8005 / 0xA001 / 0xC002
CRC-16-CCITT <math>x^{16} + x^{12} + x^5 + 1</math> (X.25, HDLC, XMODEM, Bluetooth, SD и др.) 0x1021 / 0x8408 / 0x8810[1]
CRC-16-T10-DIF <math>x^{16} + x^{15} + x^{11} + x^{9} + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1</math> (SCSI DIF) 0x8BB7[21] / 0xEDD1 / 0xC5DB
CRC-16-DNP <math>x^{16} + x^{13} + x^{12} + x^{11} + x^{10} + x^8 + x^6 + x^5 + x^2 + 1</math> (DNP, IEC 870, M-Bus) 0x3D65 / 0xA6BC / 0x9EB2
CRC-16-Fletcher Не CRC; см. Fletcher's checksum Используется в Adler-32 A & B CRC
CRC-24 <math>x^{24} + x^{22} + x^{20} + x^{19} + x^{18} + x^{16} + x^{14} + x^{13} + x^{11} + x^{10} + x^8 + x^7 + x^6 + x^3 + x + 1</math> (FlexRay[17]) 0x5D6DCB / 0xD3B6BA / 0xAEB6E5
CRC-24-Radix-64 <math> x^{24} + x^{23} + x^{18} + x^{17} + x^{14} + x^{11} + x^{10} + x^7 + x^6 + x^5 + x^4 + x^3 + x + 1 </math> (OpenPGP) 0x864CFB / 0xDF3261 / 0xC3267D
CRC-30 <math>x^{30} + x^{29} + x^{21} + x^{20} + x^{15} + x^{13} + x^{12} + x^{11} + x^{8} + x^{7} + x^{6} + x^{2} + x + 1 </math> (CDMA) 0x2030B9C7 / 0x38E74301 / 0x30185CE3
CRC-32-Adler Не CRC; см. Adler-32 См. Adler-32
CRC-32-IEEE 802.3 <math>x^{32} + x^{26} + x^{23} + x^{22} + x^{16} + x^{12} + x^{11} + x^{10} + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1</math> (V.42, MPEG-2, PNG[22], POSIX cksum) 0x04C11DB7 / 0xEDB88320 / 0x82608EDB[7]
CRC-32C (Castagnoli) <math>x^{32} + x^{28} + x^{27} + x^{26} + x^{25} + x^{23} + x^{22} + x^{20} + x^{19} + x^{18} + x^{14} + x^{13} + x^{11} + x^{10} + x^9 + x^8 + x^6 + 1</math> (iSCSI, G.hn payload) 0x1EDC6F41 / 0x82F63B78 / 0x8F6E37A0[7]
CRC-32K (Koopman) <math>x^{32} + x^{30} + x^{29} + x^{28} + x^{26} + x^{20} + x^{19} + x^{17} + x^{16} + x^{15} + x^{11} + x^{10} + x^{7} + x^{6} + x^{4} + x^{2} + x + 1</math> 0x741B8CD7 / 0xEB31D82E / 0xBA0DC66B[7]
CRC-32Q <math>x^{32} + x^{31} + x^{24} + x^{22} + x^{16} + x^{14} + x^{8} + x^{7} + x^{5} + x^{3} + x + 1</math> (aviation; AIXM[23]) 0x814141AB / 0xD5828281 / 0xC0A0A0D5
CRC-64-ISO <math>x^{64} + x^4 + x^3 + x + 1</math> (HDLC — ISO 3309) 0x000000000000001B / 0xD800000000000000 / 0x800000000000000D
CRC-64-ECMA <math>x^{64} + x^{62} + x^{57} + x^{55} + x^{54} + x^{53} + x^{52} + x^{47} + x^{46} + x^{45} + x^{40} + x^{39} + x^{38} + x^{37} + x^{35} + x^{33} +</math> <math>x^{32} + x^{31} + x^{29} + x^{27} + x^{24} + x^{23} + x^{22} + x^{21} + x^{19} + x^{17} + x^{13} + x^{12} + x^{10} + x^9 + x^7 + x^4 + x + 1</math>[24] 0x42F0E1EBA9EA3693 / 0xC96C5795D7870F42 / 0xA17870F5D4F51B49

Существующие стандарты CRC-128 (IEEE) и CRC-256 (IEEE) в настоящее время вытеснены криптографическими хеш-функциями.

Спецификации алгоритмов CRC

Одной из самых известных является методика Ross N. Williams[25]. В ней используются следующие параметры:

  • Название алгоритма (name);
  • Степень порождающего контрольную сумму многочлена (width);
  • Сам производящий полином (poly). Для того, чтобы записать его в виде значения, его сначала записывают как битовую последовательность, при этом старший бит опускается — он всегда равен 1. К примеру, многочлен <math> x^8+x^4+1 </math> в данной нотации будет записан числом <math> 00010001_2 </math>. Для удобства полученное двоичное представление записывают в шестнадцатеричной форме. Для нашего случая оно будет равно <math>11_h</math> или 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 0x589 0x0 false false 0x1 0x7E
CRC-16/DECT-X 16 0x589 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 0x4C11DB7 0x7FFFFFFF false false 0x7FFFFFFF 0xCE9E46C
CRC-32 32 0x4C11DB7 0xFFFFFFFF true true 0xFFFFFFFF 0xCBF43926
CRC-32/BZIP2 32 0x4C11DB7 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 0x4C11DB7 0xFFFFFFFF false false 0x0 0x376E6E7
CRC-32/POSIX 32 0x4C11DB7 0x0 false false 0xFFFFFFFF 0x765E7680
CRC-32Q 32 0x814141AB 0x0 false false 0x0 0x3010BF7F
CRC-32/JAMCRC 32 0x4C11DB7 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. 1 2 3 4 5 Philip Koopman, Tridib Chakravarty. [www.ece.cmu.edu/~koopman/roses/dsn04/koopman04_crc_poly_embedded.pdf Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks] (2004). Проверено ???. [www.webcitation.org/618ad4oyk Архивировано из первоисточника 23 августа 2011].
  2. [www.intuit.ru/department/network/wifi/1/wifi_1.html Интернет-Университет Информационных Технологий. Лекция: Организация беспроводных сетей ]
  3. [www.intuit.ru/department/network/baslocnet/10/baslocnet_10.html Интернет-Университет Информационных Технологий. Лекция: Алгоритмы сети Ethernet/Fast Ethernet]
  4. [ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=4317846 Walma, M.; Pipelined Cyclic Redundancy Check (CRC) Calculation]
  5. Greg Cook. [homepages.tesco.net/rainstorm/crc-catalogue.htm Catalogue of parameterised CRC algorithms] (29 апреля 2009). Проверено ???. [www.webcitation.org/618adVYf6 Архивировано из первоисточника 23 августа 2011].
  6. 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.
  7. 1 2 3 4 5 6 P. Koopman. [citeseer.ist.psu.edu/koopman02bit.html 32-Bit Cyclic Redundancy Codes for Internet Applications] // The International Conference on Dependable Systems and Networks. — июнь 2002. — С. 459. — DOI:10.1109/DSN.2002.1028931.
  8. Brayer, K; Hammond, J L Jr. (December 1975). "Evaluation of error detection polynomial performance on the AUTOVON channel" in National Telecommunications Conference, New Orleans, La. Conference Record 1: 8-21 to 8-25, New York: Institute of Electrical and Electronics Engineers. 
  9. В представлениях опущен старший бит.
  10. [www.itu.int/rec/T-REC-G.704-199810-I/en G.704], p. 12
  11. [www.epcglobalinc.org/standards/uhfc1g2/uhfc1g2_1_0_9-standard-20050126.pdf Class-1 Generation-2 UHF RFID Protocol version 1.2.0]. — 23 октября 2008. — С. 35.
  12. [www.itu.int/rec/T-REC-G.704-199810-I/en G.704], p. 9
  13. [www.itu.int/rec/T-REC-G.704-199810-I/en G.704], p. 3
  14. [www.itu.int/rec/T-REC-G.707/en G.707 : Network node interface for the synchronous digital hierarchy (SDH)]
  15. [www.itu.int/rec/T-REC-G.832/en G.832 : Transport of SDH elements on PDH networks — Frame and multiplexing structures]
  16. [www.etsi.org/deliver/etsi_en/302300_302399/302307/01.02.01_40/en_302307v010201o.pdf 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)]
  17. 1 2 FlexRay Protocol Specification version 2.1 Revision A. — 22 декабря 2005. — С. 93.
  18. A. Perez, Wismer, Becker. Byte-Wise CRC Calculations // IEEE Micro. — 1983. — Т. 3, № 3. — С. 40—50. — DOI:10.1109/MM.1983.291120.
  19. T. V. Ramabadran, S. S. Gaitonde. A tutorial on CRC computations // IEEE Micro. — 1988. — Т. 8, № 4. — С. 62—75. — DOI:10.1109/40.7773.
  20. www.incits.org/press/1997/pr97020.htm
  21. Pat Thaler. [www.t10.org/ftp/t10/document.03/03-290r0.pdf 16-bit CRC polynomial selection]. INCITS T10 (28 августа 2003). Проверено ???. [www.webcitation.org/618advs5T Архивировано из первоисточника 23 августа 2011].
  22. Thomas Boutell, Glenn Randers-Pehrson и др. [www.libpng.org/pub/png/spec/1.2/PNG-Structure.html PNG (Portable Network Graphics) Specification, Version 1.2] (14 июля 1998). Проверено ???. [www.webcitation.org/618aeMw33 Архивировано из первоисточника 23 августа 2011].
  23. [www.eurocontrol.int/aim/gallery/content/public/aicm_aixm_4_5/aixm_primer/AIXM_Primer_4.5.pdf AIXM Primer version 4.5]. European Organisation for the Safety of Air Navigation (20 марта 2006). Проверено ???. [www.webcitation.org/618aeucX4 Архивировано из первоисточника 23 августа 2011].
  24. [www.ecma-international.org/publications/standards/Ecma-182.htm ECMA-182] p. 51
  25. Ross N. Williams. [www.ross.net/crc/crcpaper.html CRC Rocksoft] (1993). [www.webcitation.org/67fzBMZSa Архивировано из первоисточника 15 мая 2012].
  26. Greg Cook. [reveng.sourceforge.net/crc-catalogue/ Catalogue of parametrised CRC algorithms] (18 January 2016).

Литература

  • Генри С. Уоррен, мл. Глава 5. Подсчет битов // Алгоритмические трюки для программистов = Hacker’s Delight. — М.: Вильямс, 2007. — 288 с. — ISBN 0-201-91465-4.

Ссылки

  • [web.archive.org/web/20130407000813/rsdn.ru/article/files/classes/SelfCheck/crcguide.pdf Элементарное руководство по CRC алгоритмам обнаружения ошибок]
  • [web.archive.org/web/20120227054137/www.rsdn.ru/article/files/classes/SelfCheck/crcrevrs.pdf CRC, и как его восстановить]
  • [www.easics.be/webtools/crctool Генератор CRC-функций] на языках VHDL и Verilog
  • Ross N. Williams/Anarchriz. [web.archive.org/web/20051229000614/www.wasm.ru/docs/5/crc.zip Всё о CRC32] // Ross N. Williams. Элементарное руководство по CRC алгоритмам обнаружения ошибок
  • Ross N. Williams. [www.ross.net/crc/download/crc_v3.txt A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS] (англ.)
CRC Калькуляторы
  • [github.com/KoynovStas/QCRC_Calc CRC-калькулятор, написан на Qt]
  • [dencode.com/hash/crc32 On-line CRC32-калькулятор, для строк (можно менять кодировку и формат EndLine)]
  • [www.zorc.breitbandkatze.de/crc.html On-line CRC-калькулятор]
  • [www.lammertbies.nl/comm/info/crc-calculation.html On-line CRC calculation and free library]


Отрывок, характеризующий Циклический избыточный код

– Нет, Соня, я не могу больше! – сказала она. – Я не могу больше скрывать от тебя. Ты знаешь, мы любим друг друга!… Соня, голубчик, он пишет… Соня…
Соня, как бы не веря своим ушам, смотрела во все глаза на Наташу.
– А Болконский? – сказала она.
– Ах, Соня, ах коли бы ты могла знать, как я счастлива! – сказала Наташа. – Ты не знаешь, что такое любовь…
– Но, Наташа, неужели то всё кончено?
Наташа большими, открытыми глазами смотрела на Соню, как будто не понимая ее вопроса.
– Что ж, ты отказываешь князю Андрею? – сказала Соня.
– Ах, ты ничего не понимаешь, ты не говори глупости, ты слушай, – с мгновенной досадой сказала Наташа.
– Нет, я не могу этому верить, – повторила Соня. – Я не понимаю. Как же ты год целый любила одного человека и вдруг… Ведь ты только три раза видела его. Наташа, я тебе не верю, ты шалишь. В три дня забыть всё и так…
– Три дня, – сказала Наташа. – Мне кажется, я сто лет люблю его. Мне кажется, что я никого никогда не любила прежде его. Ты этого не можешь понять. Соня, постой, садись тут. – Наташа обняла и поцеловала ее.
– Мне говорили, что это бывает и ты верно слышала, но я теперь только испытала эту любовь. Это не то, что прежде. Как только я увидала его, я почувствовала, что он мой властелин, и я раба его, и что я не могу не любить его. Да, раба! Что он мне велит, то я и сделаю. Ты не понимаешь этого. Что ж мне делать? Что ж мне делать, Соня? – говорила Наташа с счастливым и испуганным лицом.
– Но ты подумай, что ты делаешь, – говорила Соня, – я не могу этого так оставить. Эти тайные письма… Как ты могла его допустить до этого? – говорила она с ужасом и с отвращением, которое она с трудом скрывала.
– Я тебе говорила, – отвечала Наташа, – что у меня нет воли, как ты не понимаешь этого: я его люблю!
– Так я не допущу до этого, я расскажу, – с прорвавшимися слезами вскрикнула Соня.
– Что ты, ради Бога… Ежели ты расскажешь, ты мой враг, – заговорила Наташа. – Ты хочешь моего несчастия, ты хочешь, чтоб нас разлучили…
Увидав этот страх Наташи, Соня заплакала слезами стыда и жалости за свою подругу.
– Но что было между вами? – спросила она. – Что он говорил тебе? Зачем он не ездит в дом?
Наташа не отвечала на ее вопрос.
– Ради Бога, Соня, никому не говори, не мучай меня, – упрашивала Наташа. – Ты помни, что нельзя вмешиваться в такие дела. Я тебе открыла…
– Но зачем эти тайны! Отчего же он не ездит в дом? – спрашивала Соня. – Отчего он прямо не ищет твоей руки? Ведь князь Андрей дал тебе полную свободу, ежели уж так; но я не верю этому. Наташа, ты подумала, какие могут быть тайные причины ?
Наташа удивленными глазами смотрела на Соню. Видно, ей самой в первый раз представлялся этот вопрос и она не знала, что отвечать на него.
– Какие причины, не знаю. Но стало быть есть причины!
Соня вздохнула и недоверчиво покачала головой.
– Ежели бы были причины… – начала она. Но Наташа угадывая ее сомнение, испуганно перебила ее.
– Соня, нельзя сомневаться в нем, нельзя, нельзя, ты понимаешь ли? – прокричала она.
– Любит ли он тебя?
– Любит ли? – повторила Наташа с улыбкой сожаления о непонятливости своей подруги. – Ведь ты прочла письмо, ты видела его?
– Но если он неблагородный человек?
– Он!… неблагородный человек? Коли бы ты знала! – говорила Наташа.
– Если он благородный человек, то он или должен объявить свое намерение, или перестать видеться с тобой; и ежели ты не хочешь этого сделать, то я сделаю это, я напишу ему, я скажу папа, – решительно сказала Соня.
– Да я жить не могу без него! – закричала Наташа.
– Наташа, я не понимаю тебя. И что ты говоришь! Вспомни об отце, о Nicolas.
– Мне никого не нужно, я никого не люблю, кроме его. Как ты смеешь говорить, что он неблагороден? Ты разве не знаешь, что я его люблю? – кричала Наташа. – Соня, уйди, я не хочу с тобой ссориться, уйди, ради Бога уйди: ты видишь, как я мучаюсь, – злобно кричала Наташа сдержанно раздраженным и отчаянным голосом. Соня разрыдалась и выбежала из комнаты.
Наташа подошла к столу и, не думав ни минуты, написала тот ответ княжне Марье, который она не могла написать целое утро. В письме этом она коротко писала княжне Марье, что все недоразуменья их кончены, что, пользуясь великодушием князя Андрея, который уезжая дал ей свободу, она просит ее забыть всё и простить ее ежели она перед нею виновата, но что она не может быть его женой. Всё это ей казалось так легко, просто и ясно в эту минуту.

В пятницу Ростовы должны были ехать в деревню, а граф в среду поехал с покупщиком в свою подмосковную.
В день отъезда графа, Соня с Наташей были званы на большой обед к Карагиным, и Марья Дмитриевна повезла их. На обеде этом Наташа опять встретилась с Анатолем, и Соня заметила, что Наташа говорила с ним что то, желая не быть услышанной, и всё время обеда была еще более взволнована, чем прежде. Когда они вернулись домой, Наташа начала первая с Соней то объяснение, которого ждала ее подруга.
– Вот ты, Соня, говорила разные глупости про него, – начала Наташа кротким голосом, тем голосом, которым говорят дети, когда хотят, чтобы их похвалили. – Мы объяснились с ним нынче.
– Ну, что же, что? Ну что ж он сказал? Наташа, как я рада, что ты не сердишься на меня. Говори мне всё, всю правду. Что же он сказал?
Наташа задумалась.
– Ах Соня, если бы ты знала его так, как я! Он сказал… Он спрашивал меня о том, как я обещала Болконскому. Он обрадовался, что от меня зависит отказать ему.
Соня грустно вздохнула.
– Но ведь ты не отказала Болконскому, – сказала она.
– А может быть я и отказала! Может быть с Болконским всё кончено. Почему ты думаешь про меня так дурно?
– Я ничего не думаю, я только не понимаю этого…
– Подожди, Соня, ты всё поймешь. Увидишь, какой он человек. Ты не думай дурное ни про меня, ни про него.
– Я ни про кого не думаю дурное: я всех люблю и всех жалею. Но что же мне делать?
Соня не сдавалась на нежный тон, с которым к ней обращалась Наташа. Чем размягченнее и искательнее было выражение лица Наташи, тем серьезнее и строже было лицо Сони.
– Наташа, – сказала она, – ты просила меня не говорить с тобой, я и не говорила, теперь ты сама начала. Наташа, я не верю ему. Зачем эта тайна?
– Опять, опять! – перебила Наташа.
– Наташа, я боюсь за тебя.
– Чего бояться?
– Я боюсь, что ты погубишь себя, – решительно сказала Соня, сама испугавшись того что она сказала.
Лицо Наташи опять выразило злобу.
– И погублю, погублю, как можно скорее погублю себя. Не ваше дело. Не вам, а мне дурно будет. Оставь, оставь меня. Я ненавижу тебя.
– Наташа! – испуганно взывала Соня.
– Ненавижу, ненавижу! И ты мой враг навсегда!
Наташа выбежала из комнаты.
Наташа не говорила больше с Соней и избегала ее. С тем же выражением взволнованного удивления и преступности она ходила по комнатам, принимаясь то за то, то за другое занятие и тотчас же бросая их.
Как это ни тяжело было для Сони, но она, не спуская глаз, следила за своей подругой.
Накануне того дня, в который должен был вернуться граф, Соня заметила, что Наташа сидела всё утро у окна гостиной, как будто ожидая чего то и что она сделала какой то знак проехавшему военному, которого Соня приняла за Анатоля.
Соня стала еще внимательнее наблюдать свою подругу и заметила, что Наташа была всё время обеда и вечер в странном и неестественном состоянии (отвечала невпопад на делаемые ей вопросы, начинала и не доканчивала фразы, всему смеялась).
После чая Соня увидала робеющую горничную девушку, выжидавшую ее у двери Наташи. Она пропустила ее и, подслушав у двери, узнала, что опять было передано письмо. И вдруг Соне стало ясно, что у Наташи был какой нибудь страшный план на нынешний вечер. Соня постучалась к ней. Наташа не пустила ее.
«Она убежит с ним! думала Соня. Она на всё способна. Нынче в лице ее было что то особенно жалкое и решительное. Она заплакала, прощаясь с дяденькой, вспоминала Соня. Да это верно, она бежит с ним, – но что мне делать?» думала Соня, припоминая теперь те признаки, которые ясно доказывали, почему у Наташи было какое то страшное намерение. «Графа нет. Что мне делать, написать к Курагину, требуя от него объяснения? Но кто велит ему ответить? Писать Пьеру, как просил князь Андрей в случае несчастия?… Но может быть, в самом деле она уже отказала Болконскому (она вчера отослала письмо княжне Марье). Дяденьки нет!» Сказать Марье Дмитриевне, которая так верила в Наташу, Соне казалось ужасно. «Но так или иначе, думала Соня, стоя в темном коридоре: теперь или никогда пришло время доказать, что я помню благодеяния их семейства и люблю Nicolas. Нет, я хоть три ночи не буду спать, а не выйду из этого коридора и силой не пущу ее, и не дам позору обрушиться на их семейство», думала она.


Анатоль последнее время переселился к Долохову. План похищения Ростовой уже несколько дней был обдуман и приготовлен Долоховым, и в тот день, когда Соня, подслушав у двери Наташу, решилась оберегать ее, план этот должен был быть приведен в исполнение. Наташа в десять часов вечера обещала выйти к Курагину на заднее крыльцо. Курагин должен был посадить ее в приготовленную тройку и везти за 60 верст от Москвы в село Каменку, где был приготовлен расстриженный поп, который должен был обвенчать их. В Каменке и была готова подстава, которая должна была вывезти их на Варшавскую дорогу и там на почтовых они должны были скакать за границу.
У Анатоля были и паспорт, и подорожная, и десять тысяч денег, взятые у сестры, и десять тысяч, занятые через посредство Долохова.
Два свидетеля – Хвостиков, бывший приказный, которого употреблял для игры Долохов и Макарин, отставной гусар, добродушный и слабый человек, питавший беспредельную любовь к Курагину – сидели в первой комнате за чаем.
В большом кабинете Долохова, убранном от стен до потолка персидскими коврами, медвежьими шкурами и оружием, сидел Долохов в дорожном бешмете и сапогах перед раскрытым бюро, на котором лежали счеты и пачки денег. Анатоль в расстегнутом мундире ходил из той комнаты, где сидели свидетели, через кабинет в заднюю комнату, где его лакей француз с другими укладывал последние вещи. Долохов считал деньги и записывал.
– Ну, – сказал он, – Хвостикову надо дать две тысячи.
– Ну и дай, – сказал Анатоль.
– Макарка (они так звали Макарина), этот бескорыстно за тебя в огонь и в воду. Ну вот и кончены счеты, – сказал Долохов, показывая ему записку. – Так?
– Да, разумеется, так, – сказал Анатоль, видимо не слушавший Долохова и с улыбкой, не сходившей у него с лица, смотревший вперед себя.
Долохов захлопнул бюро и обратился к Анатолю с насмешливой улыбкой.
– А знаешь что – брось всё это: еще время есть! – сказал он.
– Дурак! – сказал Анатоль. – Перестань говорить глупости. Ежели бы ты знал… Это чорт знает, что такое!
– Право брось, – сказал Долохов. – Я тебе дело говорю. Разве это шутка, что ты затеял?
– Ну, опять, опять дразнить? Пошел к чорту! А?… – сморщившись сказал Анатоль. – Право не до твоих дурацких шуток. – И он ушел из комнаты.
Долохов презрительно и снисходительно улыбался, когда Анатоль вышел.
– Ты постой, – сказал он вслед Анатолю, – я не шучу, я дело говорю, поди, поди сюда.
Анатоль опять вошел в комнату и, стараясь сосредоточить внимание, смотрел на Долохова, очевидно невольно покоряясь ему.
– Ты меня слушай, я тебе последний раз говорю. Что мне с тобой шутить? Разве я тебе перечил? Кто тебе всё устроил, кто попа нашел, кто паспорт взял, кто денег достал? Всё я.
– Ну и спасибо тебе. Ты думаешь я тебе не благодарен? – Анатоль вздохнул и обнял Долохова.
– Я тебе помогал, но всё же я тебе должен правду сказать: дело опасное и, если разобрать, глупое. Ну, ты ее увезешь, хорошо. Разве это так оставят? Узнается дело, что ты женат. Ведь тебя под уголовный суд подведут…
– Ах! глупости, глупости! – опять сморщившись заговорил Анатоль. – Ведь я тебе толковал. А? – И Анатоль с тем особенным пристрастием (которое бывает у людей тупых) к умозаключению, до которого они дойдут своим умом, повторил то рассуждение, которое он раз сто повторял Долохову. – Ведь я тебе толковал, я решил: ежели этот брак будет недействителен, – cказал он, загибая палец, – значит я не отвечаю; ну а ежели действителен, всё равно: за границей никто этого не будет знать, ну ведь так? И не говори, не говори, не говори!
– Право, брось! Ты только себя свяжешь…
– Убирайся к чорту, – сказал Анатоль и, взявшись за волосы, вышел в другую комнату и тотчас же вернулся и с ногами сел на кресло близко перед Долоховым. – Это чорт знает что такое! А? Ты посмотри, как бьется! – Он взял руку Долохова и приложил к своему сердцу. – Ah! quel pied, mon cher, quel regard! Une deesse!! [О! Какая ножка, мой друг, какой взгляд! Богиня!!] A?
Долохов, холодно улыбаясь и блестя своими красивыми, наглыми глазами, смотрел на него, видимо желая еще повеселиться над ним.
– Ну деньги выйдут, тогда что?
– Тогда что? А? – повторил Анатоль с искренним недоумением перед мыслью о будущем. – Тогда что? Там я не знаю что… Ну что глупости говорить! – Он посмотрел на часы. – Пора!
Анатоль пошел в заднюю комнату.
– Ну скоро ли вы? Копаетесь тут! – крикнул он на слуг.
Долохов убрал деньги и крикнув человека, чтобы велеть подать поесть и выпить на дорогу, вошел в ту комнату, где сидели Хвостиков и Макарин.
Анатоль в кабинете лежал, облокотившись на руку, на диване, задумчиво улыбался и что то нежно про себя шептал своим красивым ртом.
– Иди, съешь что нибудь. Ну выпей! – кричал ему из другой комнаты Долохов.
– Не хочу! – ответил Анатоль, всё продолжая улыбаться.
– Иди, Балага приехал.
Анатоль встал и вошел в столовую. Балага был известный троечный ямщик, уже лет шесть знавший Долохова и Анатоля, и служивший им своими тройками. Не раз он, когда полк Анатоля стоял в Твери, с вечера увозил его из Твери, к рассвету доставлял в Москву и увозил на другой день ночью. Не раз он увозил Долохова от погони, не раз он по городу катал их с цыганами и дамочками, как называл Балага. Не раз он с их работой давил по Москве народ и извозчиков, и всегда его выручали его господа, как он называл их. Не одну лошадь он загнал под ними. Не раз он был бит ими, не раз напаивали они его шампанским и мадерой, которую он любил, и не одну штуку он знал за каждым из них, которая обыкновенному человеку давно бы заслужила Сибирь. В кутежах своих они часто зазывали Балагу, заставляли его пить и плясать у цыган, и не одна тысяча их денег перешла через его руки. Служа им, он двадцать раз в году рисковал и своей жизнью и своей шкурой, и на их работе переморил больше лошадей, чем они ему переплатили денег. Но он любил их, любил эту безумную езду, по восемнадцати верст в час, любил перекувырнуть извозчика и раздавить пешехода по Москве, и во весь скок пролететь по московским улицам. Он любил слышать за собой этот дикий крик пьяных голосов: «пошел! пошел!» тогда как уж и так нельзя было ехать шибче; любил вытянуть больно по шее мужика, который и так ни жив, ни мертв сторонился от него. «Настоящие господа!» думал он.
Анатоль и Долохов тоже любили Балагу за его мастерство езды и за то, что он любил то же, что и они. С другими Балага рядился, брал по двадцати пяти рублей за двухчасовое катанье и с другими только изредка ездил сам, а больше посылал своих молодцов. Но с своими господами, как он называл их, он всегда ехал сам и никогда ничего не требовал за свою работу. Только узнав через камердинеров время, когда были деньги, он раз в несколько месяцев приходил поутру, трезвый и, низко кланяясь, просил выручить его. Его всегда сажали господа.
– Уж вы меня вызвольте, батюшка Федор Иваныч или ваше сиятельство, – говорил он. – Обезлошадничал вовсе, на ярманку ехать уж ссудите, что можете.
И Анатоль и Долохов, когда бывали в деньгах, давали ему по тысяче и по две рублей.
Балага был русый, с красным лицом и в особенности красной, толстой шеей, приземистый, курносый мужик, лет двадцати семи, с блестящими маленькими глазами и маленькой бородкой. Он был одет в тонком синем кафтане на шелковой подкладке, надетом на полушубке.
Он перекрестился на передний угол и подошел к Долохову, протягивая черную, небольшую руку.
– Федору Ивановичу! – сказал он, кланяясь.
– Здорово, брат. – Ну вот и он.
– Здравствуй, ваше сиятельство, – сказал он входившему Анатолю и тоже протянул руку.
– Я тебе говорю, Балага, – сказал Анатоль, кладя ему руки на плечи, – любишь ты меня или нет? А? Теперь службу сослужи… На каких приехал? А?
– Как посол приказал, на ваших на зверьях, – сказал Балага.
– Ну, слышишь, Балага! Зарежь всю тройку, а чтобы в три часа приехать. А?
– Как зарежешь, на чем поедем? – сказал Балага, подмигивая.
– Ну, я тебе морду разобью, ты не шути! – вдруг, выкатив глаза, крикнул Анатоль.
– Что ж шутить, – посмеиваясь сказал ямщик. – Разве я для своих господ пожалею? Что мочи скакать будет лошадям, то и ехать будем.
– А! – сказал Анатоль. – Ну садись.
– Что ж, садись! – сказал Долохов.
– Постою, Федор Иванович.
– Садись, врешь, пей, – сказал Анатоль и налил ему большой стакан мадеры. Глаза ямщика засветились на вино. Отказываясь для приличия, он выпил и отерся шелковым красным платком, который лежал у него в шапке.
– Что ж, когда ехать то, ваше сиятельство?
– Да вот… (Анатоль посмотрел на часы) сейчас и ехать. Смотри же, Балага. А? Поспеешь?
– Да как выезд – счастлив ли будет, а то отчего же не поспеть? – сказал Балага. – Доставляли же в Тверь, в семь часов поспевали. Помнишь небось, ваше сиятельство.
– Ты знаешь ли, на Рожество из Твери я раз ехал, – сказал Анатоль с улыбкой воспоминания, обращаясь к Макарину, который во все глаза умиленно смотрел на Курагина. – Ты веришь ли, Макарка, что дух захватывало, как мы летели. Въехали в обоз, через два воза перескочили. А?
– Уж лошади ж были! – продолжал рассказ Балага. – Я тогда молодых пристяжных к каурому запрег, – обратился он к Долохову, – так веришь ли, Федор Иваныч, 60 верст звери летели; держать нельзя, руки закоченели, мороз был. Бросил вожжи, держи, мол, ваше сиятельство, сам, так в сани и повалился. Так ведь не то что погонять, до места держать нельзя. В три часа донесли черти. Издохла левая только.


Анатоль вышел из комнаты и через несколько минут вернулся в подпоясанной серебряным ремнем шубке и собольей шапке, молодцовато надетой на бекрень и очень шедшей к его красивому лицу. Поглядевшись в зеркало и в той самой позе, которую он взял перед зеркалом, став перед Долоховым, он взял стакан вина.
– Ну, Федя, прощай, спасибо за всё, прощай, – сказал Анатоль. – Ну, товарищи, друзья… он задумался… – молодости… моей, прощайте, – обратился он к Макарину и другим.
Несмотря на то, что все они ехали с ним, Анатоль видимо хотел сделать что то трогательное и торжественное из этого обращения к товарищам. Он говорил медленным, громким голосом и выставив грудь покачивал одной ногой. – Все возьмите стаканы; и ты, Балага. Ну, товарищи, друзья молодости моей, покутили мы, пожили, покутили. А? Теперь, когда свидимся? за границу уеду. Пожили, прощай, ребята. За здоровье! Ура!.. – сказал он, выпил свой стакан и хлопнул его об землю.
– Будь здоров, – сказал Балага, тоже выпив свой стакан и обтираясь платком. Макарин со слезами на глазах обнимал Анатоля. – Эх, князь, уж как грустно мне с тобой расстаться, – проговорил он.
– Ехать, ехать! – закричал Анатоль.
Балага было пошел из комнаты.
– Нет, стой, – сказал Анатоль. – Затвори двери, сесть надо. Вот так. – Затворили двери, и все сели.
– Ну, теперь марш, ребята! – сказал Анатоль вставая.
Лакей Joseph подал Анатолю сумку и саблю, и все вышли в переднюю.
– А шуба где? – сказал Долохов. – Эй, Игнатка! Поди к Матрене Матвеевне, спроси шубу, салоп соболий. Я слыхал, как увозят, – сказал Долохов, подмигнув. – Ведь она выскочит ни жива, ни мертва, в чем дома сидела; чуть замешкаешься, тут и слезы, и папаша, и мамаша, и сейчас озябла и назад, – а ты в шубу принимай сразу и неси в сани.
Лакей принес женский лисий салоп.
– Дурак, я тебе сказал соболий. Эй, Матрешка, соболий! – крикнул он так, что далеко по комнатам раздался его голос.