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

Я пытаюсь вычислить последовательность проверки кадра (FCS) пакета Ethernet побайтно. Полином равен 0x104C11DB7 . Я следовал алгоритму XOR-SHIFT, представленному здесь http://en.wikipedia.org/wiki/Cyclic_redundancy_check или здесь http://www.woodmann.com/fravia/crctut1.htm

Предположим, что информация, которая должна иметь CRC, составляет только один байт. Допустим, это 0x03.

  1. шаг: заполнение 32 битами вправо

    0x0300000000

  2. выравнивание полинома и данных в левой части с их первым битом, который не равен нулю, и xor их

    0x300000000 xor 0x209823B6E = 0x109823b6e

  3. выровняйте остаток и снова 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 Поле последовательности проверки кадров

Давайте продолжим приведенный выше пример :

  1. Обратный порядок следования битов вашего сообщения. Это представляет, как они будут поступать в приемник по крупицам.

    0x03 , следовательно, 0xC0

  2. Дополняет первые 32 бита вашего сообщения. Обратите внимание, что мы снова заполняем один байт 32-битным.

    0xC000000000 xor 0xFFFFFFFF = 0x3FFFFFFF00

  3. Выполните Xor и метод сдвига снова сверху.Примерно через 6 шагов вы получите:

    0x13822f2d

  4. Вышеупомянутая битовая последовательность затем дополняется.

    0x13822f2d xor 0xFFFFFFFF = 0xec7dd0d2

  5. Помните, что на первом этапе мы изменили порядок следования битов, чтобы получить представление в сети Ethernet. Теперь нам нужно отменить этот шаг, и мы, наконец, выполнили наш квест.

    0x4b0bbe37

Кто бы ни придумал этот способ сделать это, должен быть ...

Часто вы действительно хотите знать, что полученное вами сообщение является правильным. Для этого вы берете полученное сообщение, включая FCS, и выполняете те же шаги с 1 по 5, что и выше. В результате должен получиться то, что они называют остатком. Это постоянная величина для данного многочлена. В данном случае это 0xC704DD7B .

Как упоминает mcdowella , вам нужно поиграть со своими битами, пока вы не добьетесь нужного результата, в зависимости от того, какое приложение вы используете.

12
задан Community 23 May 2017 в 10:29
поделиться