Расчет Ethernet CRC32 - программное обеспечение против алгоритмического результата

Я пытаюсь вычислить последовательность проверки кадра (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 получает тот же результат. В чем разница между моим расчетом руки и алгоритмом, который использует упомянутое программное обеспечение?

ОБНОВИТЬ:

Оказывается, уже был похожий вопрос о переполнении стека:

Вы найдете ответ здесь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 упоминает, что вы должны поиграть со своими битами, пока вы не получите это правильно, в зависимости от приложения, которое вы используете.

Ответы на вопрос(4)

Ваш ответ на вопрос