Я пытаюсь вычислить последовательность проверки кадров (FCS) байта пакета Ethernet по байту. Полином равен 0x104C11DB7
.
Я выполнил описанный здесь алгоритм XOR-SHIFT http://en.wikipedia.org/wiki/Cyclic_redundancy_check или здесь http://www.woodmann.com/fravia/crctut1.htm
Предположим, что информация, которая предполагается, имеет CRC, представляет собой только один байт. Пусть говорят, что это 0x03.
-
Шаг: панель с 32 битами вправо
0x0300000000
-
выровняйте многочлен и данные с левой стороны со своим первым битом, который не равен нулю и xor их
0x300000000 xor 0x209823B6E = 0x109823b6e
-
взять выравнивание остатка и снова xor
0x109823b6e xor 0x104C11DB7 = 0x0d4326d9
Так как больше нет бит, CRC32 0x03 должен быть 0x0d4326d9
К сожалению, все версии программного обеспечения говорят мне, что я ошибаюсь, но что я сделал неправильно или что они делают по-другому?
Python говорит мне:
"0x%08x" % binascii.crc32(chr(0x03))
0x4b0bbe37
Онлайн-инструмент здесь http://www.lammertbies.nl/comm/info/crc-calculation.html#intr получает тот же результат. В чем разница между расчетом руки и алгоритмом, используемым указанным программным обеспечением?
UPDATE:
Оказывается, был и аналогичный вопрос при переполнении стека:
Здесь вы найдете ответ Проблемы с Python CRC-32
Хотя это не очень интуитивно понятно. Если вы хотите более формальное описание того, как это делается для Ethernet-фреймов, вы можете посмотреть Стандарт Ethernet 802.3. Часть 3 - Глава 3.2. 9 Поле последовательности проверки кадров
Давайте продолжим пример сверху:
-
Отмените порядок бит вашего сообщения. Это означает, что они понемногу поступают в приемник.
0x03
, следовательно,0xC0
-
Дополните первые 32 бит вашего сообщения. Обратите внимание, что мы добавим один байт с 32 бит снова.
0xC000000000 xor 0xFFFFFFFF = 0x3FFFFFFF00
-
Завершите метод Xor и shift сверху. Примерно через 6 шагов вы получите:
0x13822f2d
-
Затем добавляется вышеупомянутая последовательность бит.
0x13822f2d xor 0xFFFFFFFF = 0xec7dd0d2
-
Помните, что мы изменили порядок бит, чтобы получить представление на Ethernet-кабеле на первом шаге. Теперь мы должны отменить этот шаг, и мы, наконец, выполним наши поиски.
0x4b0bbe37
Тот, кто придумал этот способ сделать это, должен быть...
Много раз вы действительно хотите знать, что полученное вами сообщение является правильным. Чтобы достичь этого, вы принимаете ваше полученное сообщение, включая FCS, и делаете тот же шаг с 1 по 5, как указано выше. Результатом должно быть то, что они называют остатком. Которая является константой для данного многочлена. В этом случае это 0xC704DD7B
.
Как говорится в mcdowella, вы должны играть со своими битами, пока не получите правильное решение, в зависимости от используемого вами приложения.