Я пытаюсь вычислить последовательность проверки кадра (FCS) пакета Ethernet побайтно. Полином равен 0x104C11DB7
. Я следовал алгоритму XOR-SHIFT, показанному здесь http://en.wikipedia.org/wiki/Cyclic_redundancy_check или здесь http://www.woodmann.com/fravia/crctut1.htm
Предположим, что информация, которая должна иметь CRC, составляет всего один байт. Допустим, это 0x03.
step: pad с 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 и метод сдвига снова сверху. Примерно через 6 шагов вы получите:
0x13822f2d
Затем дополняется приведенная выше битовая последовательность.
0x13822f2d xor 0xFFFFFFFF = 0xec7dd0d2
Помните, что на первом шаге мы изменили порядок следования битов, чтобы получить представление в сети Ethernet. Теперь нам нужно отменить этот шаг, и мы, наконец, выполнили наш квест.
0x4b0bbe37
Тот, кто придумал этот способ, должен быть ...
Часто вы действительно хотите знать, что полученное вами сообщение является правильным. Для этого вы берете полученное сообщение, включая FCS, и выполняете те же шаги с 1 по 5, что и выше. В результате должен получиться то, что они называют остатком. Это постоянная величина для данного многочлена. В данном случае это 0xC704DD7B
.
Как упоминает mcdowella, вам нужно поиграть со своими битами, пока вы не добьетесь нужного результата, в зависимости от того, какое приложение вы используете.
(0x104C11DB7 << 1)
- person sebs   schedule 27.11.2018