Я пытаюсь вычислить последовательность проверки кадра (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 и метод сдвига снова сверху.Примерно через 6 шагов вы получите:
0x13822f2d
Вышеупомянутая битовая последовательность затем дополняется.
0x13822f2d xor 0xFFFFFFFF = 0xec7dd0d2
Помните, что на первом этапе мы изменили порядок следования битов, чтобы получить представление в сети Ethernet. Теперь нам нужно отменить этот шаг, и мы, наконец, выполнили наш квест.
0x4b0bbe37
Кто бы ни придумал этот способ сделать это, должен быть ...
Часто вы действительно хотите знать, что полученное вами сообщение является правильным. Для этого вы берете полученное сообщение, включая FCS, и выполняете те же шаги с 1 по 5, что и выше. В результате должен получиться то, что они называют остатком. Это постоянная величина для данного многочлена. В данном случае это 0xC704DD7B
.
Как упоминает mcdowella , вам нужно поиграть со своими битами, пока вы не добьетесь нужного результата, в зависимости от того, какое приложение вы используете.